엑셀_파이썬_기타 코딩

파이썬 판다스 인덱싱 iloc 발췌

2023. 10. 12. 13:52
  • 데이터프레임 인덱싱: 데이터프레임 내 특정값(들)을 불러오는 것 
  • 판다스 인덱싱에는 크게 3가지 방법이 있다.
  • 1).iloc : 정수 인덱싱에 사용
  • 2).loc :라벨로 인덱싱
  • 3)[ ] 

  • 이 포스트에서는 iloc을 다룬다.
  • 0-based indexing : 0부터 인덱싱 시작

iloc 인덱싱에 허용된 입력값 5가지 형태:

  • 정수
    예) 5
  • 정수 리스트
     예) [4, 3, 0].
  • 정수 슬라이스 개체
    예) 1:7
  • Boolean array
  • Callable function with one argument and that returns valid output for indexing 

 

1.정수 슬라이싱 예시

In [75]: df1
Out[75]: 
           0         2         4         6
0   0.149748 -0.732339  0.687738  0.176444
2   0.403310 -0.154951  0.301624 -2.179861
4  -1.369849 -0.954208  1.462696 -1.743161
6  -0.826591 -0.345352  1.314232  0.690579
8   0.995761  2.396780  0.014871  3.357427
10 -0.317441 -1.236269  0.896171 -0.487602

In [76]: df1.iloc[:3]
Out[76]: 
          0         2         4         6
0  0.149748 -0.732339  0.687738  0.176444
2  0.403310 -0.154951  0.301624 -2.179861
4 -1.369849 -0.954208  1.462696 -1.743161

In [77]: df1.iloc[1:5, 2:4]
Out[77]: 
          4         6
2  0.301624 -2.179861
4  1.462696 -1.743161
6  1.314232  0.690579
8  0.014871  3.357427
  • 참고: 슬라이싱의 경우, start bound는 포함, upper bound는 미포함.
    밑에 사례를 보면 .iloc[:3]에서는 0~2번째값까지 반환. iloc[3]은 반면 3번째값 반환. (0 인덱싱 기준)
In [69]: s1
Out[69]: 
0    0.695775
2    0.341734
4    0.959726
6   -1.110336
8   -0.619976
dtype: float64

In [70]: s1.iloc[:3]
Out[70]: 
0    0.695775
2    0.341734
4    0.959726
dtype: float64

In [71]: s1.iloc[3]
Out[71]: -1.110336102891167

2.정수 리스트 인덱싱 예시

In [78]: df1.iloc[[1, 3, 5], [1, 3]]
Out[78]: 
           2         6
2  -0.154951 -2.179861
6  -0.345352  0.690579
10 -1.236269 -0.487602

3.Boolean array 인덱싱 예시

display(df)

	A	B	C	D
a	0	-0.580772	-0.214145	-1.018106
b	1	-0.473779	-1.704241	-0.096941
c	1	-2.135681	0.751384	-0.115600
d	0	-0.469219	1.109732	-1.390092
e	0	-2.478498	0.187608	0.096225
f	0	-0.271731	-0.339511	-0.72271

df1=df.iloc[(df['B']>-1.0).values ]

	A	B	C	D
a	0	-0.580772	-0.214145	-1.018106
b	1	-0.473779	-1.704241	-0.096941
d	0	-0.469219	1.109732	-1.390092
f	0	-0.271731	-0.339511	-0.72271

-> 이름이 B인 열의 값들 중 -1보다 큰 값을 지워서 인덱싱했다. 

*iloc의 경우 loc과 달 ().values를 안붙여주면 오류난다. iloc이 순수하게 positional하기 때문에 마스크를 numpy array로 바꿔줘야 한다고 한다.  

* 어떠한 NA 값도 FALSE도 간주됨 

4.callable function 인덱싱 예시 

In [99]: df1
Out[99]: 
          A         B         C         D
a -0.023688  2.410179  1.450520  0.206053
b -0.251905 -2.213588  1.063327  1.266143
c  0.299368 -0.863838  0.408204 -1.048089
d -0.025747 -0.988387  0.094055  1.262731
e  1.289997  0.082423 -0.055758  0.536580
f -0.489682  0.369374 -0.034571 -2.484478

In [100]: df1.loc[lambda df: df['A'] > 0, :]
Out[100]: 
          A         B         C         D
c  0.299368 -0.863838  0.408204 -1.048089
e  1.289997  0.082423 -0.055758  0.536580

In [101]: df1.loc[:, lambda df: ['A', 'B']]
Out[101]: 
          A         B
a -0.023688  2.410179
b -0.251905 -2.213588
c  0.299368 -0.863838
d -0.025747 -0.988387
e  1.289997  0.082423
f -0.489682  0.369374

In [102]: df1.iloc[:, lambda df: [0, 1]]
Out[102]: 
          A         B
a -0.023688  2.410179
b -0.251905 -2.213588
c  0.299368 -0.863838
d -0.025747 -0.988387
e  1.289997  0.082423
f -0.489682  0.369374

In [103]: df1[lambda df: df.columns[0]]
Out[103]: 
a   -0.023688
b   -0.251905
c    0.299368
d   -0.025747
e    1.289997
f   -0.489682
Name: A, dtype: float64

시리즈로도 동일

In [104]: df1['A'].loc[lambda s: s > 0]
Out[104]: 
c    0.299368
e    1.289997
Name: A, dtype: float64

 

 


추가 사항들 

  • 다축 선택의 경우 dataframe 형식의 값을 , 단축 선택의 경우 series 형식의 값을 반환함. loc 및 iloc 모두 동일
  • 다만 Any of the axes accessors may be the null slice. Axes left out of the specification are assumed to be :
    e.g.) df.loc['a'] is equivalent to df.loc['a', :] 
    Series s.loc[indexer]
    DataFrame df.loc[row_indexer,column_indexer]
  • .iloc will raise IndexError if a requested indexer is out-of-bounds, except slice indexers which allow out-of-bounds indexing. (this conforms with Python/NumPy slice semantics).
In [92]: dfl
Out[92]: 
          A         B
0 -0.082240 -2.182937
1  0.380396  0.084844
2  0.432390  1.519970
3 -0.493662  0.600178
4  0.274230  0.132885

In [94]: dfl.iloc[:, 1:3] #슬라이스 인덱서의 경우 범위 밖의 인덱싱은 허용. 있는 것까지만 나옴 
Out[94]: 
          B
0 -2.182937
1  0.084844
2  1.519970
3  0.600178
4  0.132885

https://pandas.pydata.org/docs/user_guide/indexing.html#indexing-callable