이번에는 멀티 인덱스에 대해서 알아보겠습니다.
df
---------------------------------------
2 3
0 1
영업이익 컨센서스 1000 1200
잠정치 900 1400
당기순이익 컨센서스 800 900
잠정치 700 800
# 인덱스 이름 지정 및 컬럼명 지정
df.index.names = ["재무연월", ""]
df.columns = ["2020/06", "2020/09"]
df
---------------------------------------
2020/06 2020/09
재무연월
영업이익 컨센서스 1000 1200
잠정치 900 1400
당기순이익 컨센서스 800 900
잠정치 700 800
멀티 인덱스에서 인덱싱 및 슬라이싱 하는 방법
레벨0 인덱스를 이용한 인덱싱
df
---------------------------------------
2020/06 2020/09
재무연월
영업이익 컨센서스 1000 1200
잠정치 900 1400
당기순이익 컨센서스 800 900
잠정치 700 800
df.loc[[ ("영업이익", "컨센서스") ]]
-------------------------------------
2020/06 2020/09
재무연월
영업이익 컨센서스 1000 1200
df.iloc[0]
-------------------------------------
2020/06 1000
2020/09 1200
Name: (영업이익, 컨센서스), dtype: int64
df.loc[("영업이익", "컨센서스"), "2020/06"]
-------------------------------------
1000
df.loc[[("영업이익", "컨센서스")], "2020/06"]
-------------------------------------
재무연월
영업이익 컨센서스 1000
Name: 2020/06, dtype: int64
level 1 인덱스를 이용한 인덱싱 - 모든 "컨센서스" row 추출
주의사항) df.loc["컨센서스"] 라고 실행하면 KeyError가 발생한다. 이유는 데이터프레임은 낮은 레벨부터 탐색하는데, level0에서 "컨세서스" 를 찾을 수 없기때문이다.
df.loc[(slice(None), "컨센서스"),:]
---------------------------------------
2020/06 2020/09
재무연월
영업이익 컨센서스 1000 1200
당기순이익 컨센서스 800 900
slice 클래스는 아래 처럼 사용 가능하다. 리스트의 슬라이싱과 동일한 기능을 한다.
a = [1, 2, 3, 4, 5]
print(a[0:5:2])
print(a[slice(0, 5, 2)])
print(a[slice(None)])
---------------------------------
[1, 3, 5]
[1, 3, 5]
[1, 2, 3, 4, 5]
리스트 내부에서는 ":" 와 "slice(None)" 가 동일하게 작동한다. 하지만 멀티 인덱스에서 튜플안의 콜론(:)을 사용하면 오류가 발생한다.
# 리스트 내부에서는 ":" 와 "slice(None)" 가 동일하게 작동한다.
a = [1, 2, 3, 4, 5]
print(a[:])
print(a[slice(None)])
print(a[ : : ])
print(a[slice(None, None)])
------------------------------------
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
# 하지만 멀티 인덱스에서 튜플안의 콜론(:)을 사용하면 오류가 발생한다.
print( df.loc[ ( :, '컨센서스'), : ] )
------------------------------------
File "/var/folders/8g/6db8jk457wn01775hfrwvhb40000gn/T/ipykernel_874/629640380.py", line 1
print( df.loc[ ( :, '컨센서스'), : ] )
^
SyntaxError: invalid syntax
# 그래서 멀티 인덱스에서 튜플안의 콜론(:) 대신 slice(None)을 사용해야 한다.
df.loc[ (slice(None), '컨센서스'), :]
------------------------------------
2020/06 2020/09
재무연월
영업이익 컨센서스 1000 1200
당기순이익 컨센서스 800 900
slice(None) 대신에 판다스의 IndexSlice 를 사용할 수 있다. IndexSlice 는 인덱싱 기호화 함께 ["level 0", "level 1", ..] 형태로 인덱스를 차례로 지정 가능하다. 행과 열을 모두 지정해야 한다.
idx = pd.IndexSlice
df.loc[idx[:, "컨센서스"], :]
-------------------------------------------------
2020/06 2020/09
재무연월
영업이익 컨센서스 1000 1200
당기순이익 컨센서스 800 900
'Python > Data analysis' 카테고리의 다른 글
[Python] Data Analysis - DataFrame - Stack / Unstack (0) | 2023.04.07 |
---|---|
[Python] Data Analysis - DataFrame - multi-column (0) | 2023.04.07 |
[Python] Data Analysis - DataFrame - join (0) | 2023.04.06 |
[Python] Data Analysis - DataFrame - merge (0) | 2023.04.05 |
[Python] Data Analysis - DataFrame - add data (0) | 2023.04.04 |