- 데이터프레임 인덱싱: 데이터프레임 내 특정값(들)을 불러오는 것
- 판다스 인덱싱에는 크게 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
'엑셀_파이썬_기타 코딩' 카테고리의 다른 글
채권 벤치마크 구성 재현하기 (0) | 2023.11.08 |
---|---|
엑셀 VBA Printout 메쏘드 (인쇄) (0) | 2023.10.12 |
VBA 폼 수정 (데이터 검색 조건 추가) (0) | 2023.10.02 |
분 단위 데이터 분석 -판다스 피벗테이블 활용 (0) | 2023.09.30 |
엑셀 차트 그리는 도구 (엑셀 사용자 foam) (0) | 2023.09.12 |