그림과 같은 멀티 인덱스를 기대하고 아래 코드를 실행했다
import io
import pandas as pd
csv = '''
A팀 B팀 C팀
삼성전자 카카오 삼성전자 카카오 삼성전자 카카오
2023-08-14 10 20 30 40 50 60
2023-08-16 20 20 30 40 50 60
2023-08-17 30 40 10 20 50 60
2023-08-18 30 40 10 20 50 60
2023-08-21 30 40 30 40 30 40
'''
df = pd.read_csv(io.StringIO(csv), sep='\t', index_col=0, header=[0, 1])
df
결과는 아래와 같이 column 이름에 Unnamed가 발생했다
그 때는 아래와 같은 코드를 실행해보자
df1 = df.columns.to_frame(index=False).apply(lambda x: x.mask(x.str.contains('Unnamed'))).ffill()
df = df.set_axis(pd.MultiIndex.from_frame(df1), axis=1)
혹시 인덱스명을 없애고 싶다면 아래와 같은 코드를 사용하자
df1 = df.columns.to_frame(index=False).apply(lambda x: x.mask(x.str.contains('Unnamed'))).ffill()
df = df.set_axis(pd.MultiIndex.from_frame(df1, names=[''] * len(df.columns[0])), axis=1)
names에 columns의 레벨의 개수에 맞춰 ''을 입력하면 된다.
이 경우 2개의 레벨을 가진 멀티인덱스니까 names=['', '']을 입력하면 되는데 혹시 이 코드를 돌리는 분이 다른 개수의 멀티인덱스를 가질 때도 똑같은 코드로 돌리게 될 까봐 names=[''] * len(df.columns[0]) 으로 대체하였다
결과는 아래와 같다.
df
우리가 원하는 멀티인덱스 구조를 갖추게 된다
유튜브에서 판다스 강의 중입니다
https://www.youtube.com/@KimPandas
'판다스 > 판다스 팁' 카테고리의 다른 글
apply를 무분별하게 쓰면 안되는 이유 (0) | 2023.08.25 |
---|---|
[pandas] 엑셀의 날짜가 숫자로 읽어질 때 datetime으로 변환하는 방법 (0) | 2023.08.25 |
[pandas] set과 frozenset의 차이 (0) | 2023.08.07 |
[pandas] 특정 열의 값으로 데이터 프레임 나눠서 리스트로 만들기 (0) | 2023.08.06 |
[pandas] 정규표현식에서 그룹명을 지정하기 (0) | 2023.08.06 |