반응형

17-02 피벗화, 열의 인덱스화 (stack)

DataFrame.stack(level=- 1, dropna=True)

 

개요


stack 메서드는 열을 피벗하여 하위 인덱스로 변환하는 메서드입니다.

 

사용법


기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.stack(level=- 1, dropna=True)
level : MultiColumns의 경우 하위인덱스로 변환할 열의 레벨입니다. 기본값은 -1로 최하위 레벨이 선택됩니다. dropna : {True / False} 기본값은 True로 피벗화로인해 생성된 하위인덱스의 모든 값이 결측치(NaN)인 경우 해당 열이 제거됩니다.

반응형

 

예시


먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.

data = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
idx = [['idx1','idx1','idx2','idx2'],['row1','row2','row3','row4']]
col = [['val1','val1','val2','val2'],['col1','col2','col3','col4']]
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
>>
           val1      val2     
           col1 col2 col3 col4
idx1 row1     0    1    2    3
     row2     4    5    6    7
idx2 row3     8    9   10   11
     row4    12   13   14   15


기본적인 사용법
'level'의 기본값은 '-1'로 최하위 레벨이 선택됩니다. 위 df에서는 level=1이 최하위 계층이기 때문에,
df.stack( ) = df.stack(level=1) 입니다. 함수 실행 시 level=1의 열이 인덱스로 피벗된걸 확인할 수 있습니다.

print(df.stack())
>>
                val1  val2
idx1 row1 col1   0.0   NaN
          col2   1.0   NaN
          col3   NaN   2.0
          col4   NaN   3.0
     row2 col1   4.0   NaN
          col2   5.0   NaN
          col3   NaN   6.0
          col4   NaN   7.0
idx2 row3 col1   8.0   NaN
          col2   9.0   NaN
          col3   NaN  10.0
          col4   NaN  11.0
     row4 col1  12.0   NaN
          col2  13.0   NaN
          col3   NaN  14.0
          col4   NaN  15.0


level=0인 경우 아래와같이 'val1', 'val2'가 포함된 level=0의 열이 피벗화 되는것을 볼 수 있습니다.

                col1  col2  col3  col4
idx1 row1 val1   0.0   1.0   NaN   NaN
          val2   NaN   NaN   2.0   3.0
     row2 val1   4.0   5.0   NaN   NaN
          val2   NaN   NaN   6.0   7.0
idx2 row3 val1   8.0   9.0   NaN   NaN
          val2   NaN   NaN  10.0  11.0
     row4 val1  12.0  13.0   NaN   NaN
          val2   NaN   NaN  14.0  15.0


level=(0,1)처럼 튜플로 묶어줄 경우 해당되는 모든 계층에 대해 피벗화를 할 수 있습니다.
모든 계층(레벨)이 피벗화 될 경우 Serise 객체로 출력됩니다.

idx1  row1  val1  col1     0.0
                  col2     1.0
            val2  col3     2.0
                  col4     3.0
      row2  val1  col1     4.0
                  col2     5.0
            val2  col3     6.0
                  col4     7.0
idx2  row3  val1  col1     8.0
                  col2     9.0
            val2  col3    10.0
                  col4    11.0
      row4  val1  col1    12.0
                  col2    13.0
            val2  col3    14.0
                  col4    15.0
dtype: float64


dropna인수의 사용
dropna인수는 기본값이 True로 열이 피벗화된 인덱스의 값이 NaN이면 해당 열을 출력하지 않습니다.
예시를 위해 간단한 2x2 짜리 데이터를 만들어보겠습니다.

data = [[np.NaN,1],[2,3]]
idx = ['row1','row2']
col = ['col1','col2']
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
>>
      col1  col2
row1   NaN     1
row2   2.0     3


stack메서드를 사용할 경우 col1col2 열이 인덱스로 피벗화되는데, row1-col1의 값은 NaN이기 때문에 출력에서는 아래와같이 제거됩니다.

print(df.stack())
>>
row1  col2    1.0 # row1에 대해서 col1의 값이 제거됨
row2  col1    2.0 # 모든 열이 피벗화 되었기 때문에 Series로 출력
      col2    3.0
dtype: float64


dropna=True로 출력 할 경우 결측값을 갖는 열 또한 정상적으로 출력되는것을 볼 수 있습니다.

print(df.stack(dropna=False))
>>
row1  col1    NaN
      col2    1.0
row2  col1    2.0
      col2    3.0
dtype: float64
반응형

+ 최근 글