Pandas 다중 인덱스를 열로 변환하는 방법
다음은 두 가지 일반적인 방법입니다.
set_index와 reset_index 사용:
이 방법은 다중 인덱스를 하나의 열로 설정하고, 나중에 다시 데이터 프레임으로 변환합니다.
import pandas as pd
# 다중 인덱스가 있는 데이터 프레임 만들기
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 'A' 열을 인덱스로 설정
df = df.set_index('A')
# 인덱스를 열로 다시 변환
df = df.reset_index()
print(df)
stack과 unstack 사용:
stack
함수는 다중 인덱스의 레벨을 열로 변환하고, unstack
함수는 반대의 작업을 수행합니다.
import pandas as pd
# 다중 인덱스가 있는 데이터 프레임 만들기
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 다중 인덱스를 열로 변환
df = df.stack()
# 열을 다중 인덱스로 다시 변환
df = df.unstack()
print(df)
주의 사항:
set_index
를 사용하면 기존 인덱스가 사라집니다.- 다중 인덱스의 레벨 수가 2개 이상인 경우
stack
함수를 사용해야 합니다.
이 외에도 pivot_table
함수를 사용하여 다중 인덱스를 열로 변환하는 방법도 있습니다.
어떤 방법을 사용할지는 데이터 프레임의 구조와 원하는 결과에 따라 다릅니다.
예제 코드: 다중 인덱스를 열로 변환
set_index와 reset_index 사용
import pandas as pd
# 데이터 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 'A' 열을 인덱스로 설정
df = df.set_index('A')
# 인덱스를 열로 다시 변환
df = df.reset_index()
print(df)
출력:
A B C
0 a 1 4 7
1 a 2 5 8
2 b 3 6 9
stack과 unstack 사용
import pandas as pd
# 데이터 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 다중 인덱스를 열로 변환
df = df.stack()
# 열을 다중 인덱스로 다시 변환
df = df.unstack()
print(df)
A 1 2 3
B 1 4 5 6
C 7 8 9
설명:
set_index('A')
: 'A' 열을 인덱스로 설정합니다. 이렇게 하면 기존 행 인덱스가 제거됩니다.reset_index()
: 인덱스를 새로운 열로 변환하여 데이터 프레임을 다시 평평하게 만듭니다.stack()
: 다중 인덱스의 레벨을 열로 변환합니다. 새로운 열 이름은 원래 인덱스 이름의 연결になります.unstack()
: 열을 다중 인덱스로 다시 변환합니다.
이 두 예제는 모두 동일한 결과를 생성합니다. 하지만 데이터 프레임의 구조와 원하는 결과에 따라 어떤 방법을 사용할지 선택하는 것이 중요합니다.
pivot_table 사용
다중 인덱스를 열로 변환하는 또 다른 방법은 pivot_table
함수를 사용하는 것입니다.
import pandas as pd
# 데이터 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 'A' 열을 행 인덱스로, 'B' 열을 열 인덱스로 설정하고, 'C' 열을 값으로 설정하여 피벗 테이블 만들기
df = df.pivot_table(index='A', columns='B', values='C')
print(df)
B 4 5 6
A
a 1 7 8
2 8 9
b 3 9 NaN
pivot_table
함수는 다중 인덱스를 처리하는 데 강력한 도구이며, 다양한 집계 함수를 지원합니다.
결론
다중 인덱스를 열로 변환하는 방법은 여러 가지가 있습니다.
stack
과unstack
pivot_table
Pandas 다중 인덱스를 열로 변환하는 대체 방법
rename_axis 사용:
rename_axis
함수를 사용하여 다중 인덱스 레벨의 이름을 변경하여 열 이름으로 사용할 수 있습니다.
import pandas as pd
# 데이터 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 첫 번째 인덱스 레벨 이름을 'A'로 변경
df.index = df.index.rename_axis(['A'], axis=1)
# 데이터 프레임을 전치
df = df.T
# 'A' 열을 제거
df = df.drop('A', axis=1)
print(df)
1 2 3
B 4 5 6
C 7 8 9
explode 사용:
explode
함수는 다중 인덱스를 여러 행으로 분할하는 데 사용할 수 있으며, 이를 통해 열을 만들 수 있습니다.
import pandas as pd
# 데이터 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 다중 인덱스를 행으로 분할
df = df.explode(level=1)
# 'A' 열을 인덱스로 설정
df = df.set_index('A')
print(df)
B C
A
a 1 4 7
2 5 8
b 3 6 9
to_numpy와 reshape 사용:
to_numpy
함수를 사용하여 데이터 프레임을 NumPy 배열로 변환하고, reshape
함수를 사용하여 원하는 형태로 변형할 수 있습니다.
import pandas as pd
import numpy as np
# 데이터 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=[pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 3)]),
range(3)])
# 데이터 프레임을 NumPy 배열로 변환
arr = df.to_numpy()
# 원하는 형태로 배열 재구성
arr = arr.reshape(arr.shape[1], -1)
# NumPy 배열을 Pandas DataFrame으로 변환
df = pd.DataFrame(arr, columns=df.columns)
print(df)
A B C
0 1 4 7
1 2 5 8
2 3 6 9
rename_axis
를 사용하면 원본 데이터 프레임이 변경되지 않고 새 복사본이 만들어집니다.explode
를 사용하면 데이터 프레임의 행 수가 증가합니다.to_numpy
와reshape
를 사용하는 방법은 다소 복잡할 수 있습니다.
이 외에도 다양한 라이브러리와 도구를 사용하여 Pandas 다중 인덱스를 열로 변환할 수 있습니다.
어떤 방법을 사용할지는 개인의 선호와 특정 상황에 따라 다릅니다.
python pandas dataframe