Python/NumPy | Pandas

[Python] Pandas - 데이터프레임 인덱스 조작 2

비번변경 2022. 12. 24. 23:26

개요

2022.12.23 - [Python] Pandas - 데이터프레임 인덱스 조작 1에 이어 DataFrame의 index를 다루는 방법을 정리한다.

 

 

다중 인덱스가 있는 경우의 인덱싱

DataFrame이 다중 인덱스를 가질 때는 튜플 형식으로 인덱싱해야 한다. 예로 들어 아래와 같은 DataFrame이 있다고 하자.

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.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

df3의 Cidx1가 B이고, Cidx2는 C1인 열을 인덱싱할 때는 다음과 같이 인덱싱해야 한다.

df3[('B', 'C1')]
df3.loc[:, ('B', 'C1')]

# 실행 결과
0    0.98
1    0.95
2    0.14
3    0.44
4    0.31
Name: (B, C1), dtype: float64

0    0.98
1    0.95
2    0.14
3    0.44
4    0.31
Name: (B, C1), dtype: float64

iloc 인덱서는 튜플 형식의 인덱싱을 지원하지 않는다.

또한 하나의 레벨 값만 넣으면 가장 상위의 값을 지정한 것으로 취급한다.

df3['B']

# 실행 결과
Cidx2    C1    C2
0      0.98  2.24
1      0.95 -0.15
2      0.14  1.45
3      0.44  0.33
4      0.31 -0.85

 

다중 인덱스 튜플 내에서는 슬라이스 기호 대시 slice(None)을 사용해야 한다.

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
df4.loc[('M', slice(None)), 'B']

# 실행 결과
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
      
Cidx2           C     D
Ridx1 Ridx2            
M     id_1   0.98  2.24
      id_2   0.95 -0.15
      id_3   0.14  1.45

 

 

다중 인덱스의 인덱스 순서 교환

swaplevel(i, j, axis)

다중 인덱스의 인덱스 순서를 바꾸는 함수로, i와 j에는 교환할 인덱스 라벨을 axis에는 축을 전달한다. axis가 0일 때는 행 인덱스에 대해, 1일 때는 열 인덱스에 대해 동작한다. 기본값은 0이다.

df4.swaplevel('Ridx2', 'Ridx1')
df4.swaplevel('Cidx2', 'Cidx1', axis=1)

# 실행 결과
Cidx1           A           B      
Cidx2           C     D     C     D
Ridx2 Ridx1                        
id_1  M      1.76  0.40  0.98  2.24
id_2  M      1.87 -0.98  0.95 -0.15
id_3  M     -0.10  0.41  0.14  1.45
id_1  F      0.76  0.12  0.44  0.33
id_2  F      1.49 -0.21  0.31 -0.85
id_3  F     -2.55  0.65  0.86 -0.74

Cidx2           C     D     C     D
Cidx1           A     A     B     B
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

 

 

다중 인덱스가 있는 경우의 정렬

sort_index(level)

다중 인덱스가 있는 DataFrame을 정렬할 때는 어떤 인덱스를 기준으로 정렬할지 level 매개변수로 지정한다.

df4.sort_index(level=0)

# 실행 결과
Cidx1           A           B      
Cidx2           C     D     C     D
Ridx1 Ridx2                        
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
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

 

열 인덱스를 기준으로 정렬할 때는 axis를 1로 지정한다.

df4.sort_index(level=1, axis=1)

# 실행 결과
Cidx1           A     B     A     B
Cidx2           C     C     D     D
Ridx1 Ridx2                        
M     id_1   1.76  0.98  0.40  2.24
      id_2   1.87  0.95 -0.98 -0.15
      id_3  -0.10  0.14  0.41  1.45
F     id_1   0.76  0.44  0.12  0.33
      id_2   1.49  0.31 -0.21 -0.85
      id_3  -2.55  0.86  0.65 -0.74

 

 

참고 문서

데이터 사이언스 스쿨 - 4.5 데이터프레임 인덱스 조작