개요
DataFrame의 index 다루는 방법을 정리한다.
데이터프레임 인덱스 설정 및 제거
DataFrame에 index로 들어가야 하는 데이터가 일반 데이터 열에 들어가 있거나, 데이터 열에 들어가야 하는 값이 index로 들어가 있는 경우가 있을 수 있다. 이련 경우 set_index, reset_index 함수를 이용해 index와 일반 데이터 열을 교환할 수 있다.
set_index
행 인덱스를 제거하고 데이터 열 중 하나를 인덱스로 설정한다. 매개변수로 행 인덱스로 설정한 열을 지정한다.
예로 들어 아래 데이터는 index로 들어가야 하는 데이터가 C1 열에 들어가 있다.
np.random.seed(0)
df1 = pd.DataFrame(np.vstack([list('ABCDE'),
np.round(np.random.rand(3, 5), 2)]).T,
columns=["C1", "C2", "C3", "C4"])
df1
# 실행 결과
C1 C2 C3 C4
0 A 0.55 0.65 0.79
1 B 0.72 0.44 0.53
2 C 0.6 0.89 0.57
3 D 0.54 0.96 0.93
4 E 0.42 0.38 0.07
이 경우 set_index 함수에 C1을 전달하면 기존 인덱스 대신 C1을 인덱스로 사용한다.
df1.set_index('C1')
# 실행 결과
C2 C3 C4
C1
A 0.55 0.65 0.79
B 0.72 0.44 0.53
C 0.6 0.89 0.57
D 0.54 0.96 0.93
E 0.42 0.38 0.07
reset_index
인덱스를 일반 데이터 열로 변경한다. 데이터 열로 변경할 때 제일 왼편에 삽입되며 인덱스는 기본값으로 변경된다.
df1.reset_index()
# 실행 결과
index C1 C2 C3 C4
0 0 A 0.55 0.65 0.79
1 1 B 0.72 0.44 0.53
2 2 C 0.6 0.89 0.57
3 3 D 0.54 0.96 0.93
4 4 E 0.42 0.38 0.07
매개변수 drop을 True로 설정하면 인덱스 열을 데이터 열로 변경하는 것이 아니라, 값을 버린다.
다중 인덱스
행이나 열에 여러 계층을 가지는 인덱스를 다중 인덱스라고 한다. DataFrame 생성 시 columns 인수에 리스트를 원소로 하는 리스트를 전달하면 다중 열 인덱스를 설정할 수 있다.
np.random.seed(0)
df3 = pd.DataFrame(np.round(np.random.randn(5, 4), 2),
columns=[["A", "A", "B", "B"],
["C1", "C2", "C1", "C2"]])
df3
# 실행 결과
A B
C1 C2 C1 C2
0 1.76 0.40 0.98 2.24
1 1.87 -0.98 0.95 -0.15
2 -0.10 0.41 0.14 1.45
3 0.76 0.12 0.44 0.33
4 1.49 -0.21 0.31 -0.85
다중 인덱스를 사용할 때는 편리하게 사용할 수 있도록 인덱스 이름을 지정하는 것이 좋다.
df3.columns.names = ['Cidx1', 'Cidx2']
df3
# 실행 결과
Cidx1 A B
Cidx2 C1 C2 C1 C2
0 1.76 0.40 0.98 2.24
1 1.87 -0.98 0.95 -0.15
2 -0.10 0.41 0.14 1.45
3 0.76 0.12 0.44 0.33
4 1.49 -0.21 0.31 -0.85
행 인덱스도 동일하게 설정할 수 있다.
np.random.seed(0)
df4 = pd.DataFrame(np.round(np.random.randn(6, 4), 2),
columns=[["A", "A", "B", "B"],
["C", "D", "C", "D"]],
index=[["M", "M", "M", "F", "F", "F"],
["id_" + str(i + 1) for i in range(3)] * 2])
df4.columns.names = ["Cidx1", "Cidx2"]
df4.index.names = ["Ridx1", "Ridx2"]
df4
# 실행 결과
Cidx1 A B
Cidx2 C D C D
Ridx1 Ridx2
M id_1 1.76 0.40 0.98 2.24
id_2 1.87 -0.98 0.95 -0.15
id_3 -0.10 0.41 0.14 1.45
F id_1 0.76 0.12 0.44 0.33
id_2 1.49 -0.21 0.31 -0.85
id_3 -2.55 0.65 0.86 -0.74
행 인덱스와 열 인덱스 교환
stack
열 인덱스를 행 인덱스로 변환한다. 열 인덱스가 반시계 방향으로 90도 회전한 것과 비슷하다.
df4.stack("Cidx1")
# 실행 결과
Cidx2 C D
Ridx1 Ridx2 Cidx1
M id_1 A 1.76 0.40
B 0.98 2.24
id_2 A 1.87 -0.98
B 0.95 -0.15
id_3 A -0.10 0.41
B 0.14 1.45
F id_1 A 0.76 0.12
B 0.44 0.33
id_2 A 1.49 -0.21
B 0.31 -0.85
id_3 A -2.55 0.65
B 0.86 -0.74
unstack
행 인덱스를 열 인덱스로 변환한다. 행 인덱스가 시계 방향으로 90도 회전한 것과 비슷하다.
df4.unstack('Ridx2')
# 실행 결과
Cidx1 A B
Cidx2 C D C D
Ridx2 id_1 id_2 id_3 id_1 id_2 id_3 id_1 id_2 id_3 id_1 id_2 id_3
Ridx1
F 0.76 1.49 -2.55 0.12 -0.21 0.65 0.44 0.31 0.86 0.33 -0.85 -0.74
M 1.76 1.87 -0.10 0.40 -0.98 0.41 0.98 0.95 0.14 2.24 -0.15 1.45
참고 문서
데이터 사이언스 스쿨 - 4.5 데이터프레임 인덱스 조작