Python/NumPy | Pandas

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

비번변경 2022. 12. 23. 22:43

개요

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 데이터프레임 인덱스 조작