본문 바로가기

Python/Data analysis

[Python] Data Analysis - DataFrame - multi-index

이번에는 멀티 인덱스에 대해서 알아보겠습니다.

 

 

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