데이터프레임 인덱스 설정 및 제거¶때로는 데이터프레임에 인덱스로 들어가 있어야 할 데이터가 일반 데이터 열에 들어가 있거나 반대로 일반 데이터 열이어야 할 것이 인덱스로 되어 있을 수 있다. 이 때는 Show
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
df2 = df1.set_index("C1") df2
마찬가지로 C2열을 인덱스로 지정하면 기존의 인덱스는 사라진다.
반대로
df2.reset_index(drop=True)
연습 문제 4.5.1 5명의 학생의 국어, 영어, 수학 점수를 나타내는 데이터프레임을 다음과 같이 만든다.
다중 인덱스¶행이나 열에 여러 계층을 가지는 인덱스 즉, 다중 인덱스(multi-index)를 설정할 수도 있다. 데이터프레임을 생성할 때 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
다중 인덱스는 이름을 지정하면 더 편리하게 사용할 수 있다. 열 인덱스들의 이름 지정은 df3.columns.names = ["Cidx1", "Cidx2"] df3
마찬가지로 데이터프레임을 생성할 때 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
행 인덱스와 열 인덱스 교환¶
다중 인덱스가 있는 경우의 인덱싱¶데이터프레임이 다중 인덱스를 가지는 경우에는 인덱스 값이 하나의 라벨이나 숫자가 아니라
0 0.98 1 0.95 2 0.14 3 0.44 4 0.31 Name: (B, C1), dtype: float64
df3.loc[0, ("B", "C1")] = 100 df3
단, 만약 하나의 레벨 값만 넣으면 다중 인덱스 중에서 가장 상위의 값을 지정한 것으로 본다.
df4.loc[("M", "id_1"), ("A", "C")] Ridx1 Ridx2 M id_1 1.76 id_2 1.87 id_3 -0.10 F id_1 0.76 id_2 1.49 id_3 -2.55 Name: (A, C), dtype: float64 df4.loc[("M", "id_1"), :] Cidx1 Cidx2 A C 1.76 D 0.40 B C 0.98 D 2.24 Name: (M, id_1), dtype: float64 df4.loc[("All", "All"), :] = df4.sum() df4
특정 레벨의 모든 인덱스 값을 인덱싱할 때는 슬라이스를 사용한다. 다만 다중 인덱스의 튜플 내에서는 df4.loc[("M", slice(None)), :]
df4.loc[(slice(None), "id_1"), :]
다중 인덱스의 인덱스 순서 교환¶다중 인덱스의 인덱스 순서를 바꾸고 싶으면
df5 = df4.swaplevel("Ridx1", "Ridx2") df5
df6 = df4.swaplevel("Cidx1", "Cidx2", 1) df6
다중 인덱스가 있는 경우의 정렬¶다중 인덱스가 있는 데이터프레임을
df6.sort_index(axis=1, level=0)
연습 문제 4.5.2 A 반 학생 5명과 B반 학생 5명의 국어, 영어, 수학 점수를 나타내는 데이터프레임을 다음과 같이 만든다.
|