반응형

09-09. 피벗변환 (pivot)

DataFrame.pivot(index=None, columns=None, values=None)

 

개요


pivot메서드는 데이터의 열을 기준으로 피벗테이블로 변환시키는 메서드 입니다.

 

사용법


기본 사용법
df.pivot(index=None, columns=None, values=None)
index : 인덱스로 사용될 열입니다.
columns : 열로 사용될 열 입니다.
values : 값으로 입력될 열 입니다.
※ index나 columns에 리스트를 입력 할 경우 멀티 인덱스로 피벗테이블이 생성됩니다.
values에 리스트를 입력 할 경우 각 값에 대한 테이블이 연속적으로 생성됩니다.

반응형

 

예시


먼저, 아래와 같이 간단한 6x4 객체를 만들어 보겠습니다.

col = ['Machine','Country','Price','Brand']
data = [['TV','Korea',1000,'A'],
        ['TV','Japan',1300,'B'],
        ['TV','China',300,'C'],
        ['PC','Korea',2000,'A'],
        ['PC','Japan',3000,'E'],
        ['PC','China',450,'F']]
df = pd.DataFrame(data=data, columns=col)
print(df)
>>
  Machine Country  Price Brand
0      TV   Korea   1000     A
1      TV   Japan   1300     B
2      TV   China    300     C
3      PC   Korea   2000     A
4      PC   Japan   3000     E
5      PC   China    450     F

기본적인 사용법
index를 Machine으로 columns를 Country로, values를 Price로 피벗 테이블을 생성해보겠습니다.

print(df.pivot(index='Machine',columns='Country',values='Price'))
>>
Country  China  Japan  Korea
Machine                     
PC         450   3000   2000
TV         300   1300   1000

values값이 list형태일 경우 피벗테이블이 옆쪽으로 연속으로 생성됩니다.

print(df.pivot(index='Machine',columns='Country',values=['Price','Brand']))
>>
        Price             Brand            
Country China Japan Korea China Japan Korea
Machine                                    
PC        450  3000  2000     F     E     A
TV        300  1300  1000     C     B     A

참고로, values를 따로 입력하지 않으면 남은 모든 열이 values에 입력되어 연속으로 출력됩니다.

print(df.pivot(index='Machine',columns='Country')
>>
        Price             Brand            
Country China Japan Korea China Japan Korea
Machine                                    
PC        450  3000  2000     F     E     A
TV        300  1300  1000     C     B     A

그 상태에서 [열 이름] 형태를 붙여서 원하는 values만 출력할 수 있습니다.

print(df.pivot(index='Machine',columns='Country')['Brand'])
>>
Country China Japan Korea
Machine                  
PC          F     E     A
TV          C     B     A


Multi index로 피벗 변환
index나 columns에 list형태의 데이터를 입력할 경우 멀티 인덱스 형식으로 피벗 테이블이 생성됩니다.

index가 list형태일 경우

print(df.pivot(index=['Country','Machine'],columns='Brand',values='Price'))
>>
Brand                 A       B      C       E      F
Country Machine                                      
China   PC          NaN     NaN    NaN     NaN  450.0
        TV          NaN     NaN  300.0     NaN    NaN
Japan   PC          NaN     NaN    NaN  3000.0    NaN
        TV          NaN  1300.0    NaN     NaN    NaN
Korea   PC       2000.0     NaN    NaN     NaN    NaN
        TV       1000.0     NaN    NaN     NaN    NaN

columns가 list형태일 경우

print(df.pivot(index='Country',columns=['Machine','Brand'],values='Price'))
>>
Machine      TV                     PC               
Brand         A       B      C       A       E      F
Country                                              
China       NaN     NaN  300.0     NaN     NaN  450.0
Japan       NaN  1300.0    NaN     NaN  3000.0    NaN
Korea    1000.0     NaN    NaN  2000.0     NaN    NaN


피벗변환이 불가한 경우
중복값으로인해 피벗테이블의 생성이 불가능한 경우 오류를 반환합니다.

# 피벗화가 불가능한 중복값이 있는 객체 생성
df2 = pd.DataFrame(data=[['A','x',1],['A','x',2],['B','y',3],['B','z',4]],columns=['col1','col2','col3'])
print(df2)
>>
  col1 col2  col3
0    A    x     1
1    A    x     2
2    B    y     3
3    B    z     4
# 피벗생성 시 오류 발생
print(df2.pivot(index='col1',columns='col2',values='col3'))
>>
오류발생
ValueError: Index contains duplicate entries, cannot reshape
반응형

+ 최근 글