본문 바로가기
Python_Wiki/Python_Library

pandas: 피벗테이블 만들기 .pivot_table /+) pivot

by yj-data 2025. 7. 14.

피벗테이블은 crosstab이랑은 다르게, 엑셀 피벗테이블처 값 영역에 변수를 별도로 넣어서 계산을 할 수 있음

#index 행, columns 열, values 값에 넣을 열, aggfunc 집계함수
pd.pivot_table(df, index='Sex', columns='Pclass', values='Survived', aggfunc='mean')

여자 + 1클래스 일수록 생존확률이 높음(96%가 생존)

 

 

#crosstab처럼 margins 가능
pd.pivot_table(df, index='Sex', columns='Survived', values='Age', aggfunc='mean', margins=True)

#aggfunction에 여러개
pd.pivot_table(df, index='Sex', columns='Survived', values='Age', aggfunc=['max','min','mean'])

#다중인덱스, 다중컬럼, 다중 값
pd.pivot_table(df, index=['Sex','Pclass'], columns=['Survived','Embarked'], values=['Age','Fare'], aggfunc='mean')

 

lambda로 인덱싱

# 가장 나이가 많은 사람 이름 추출하는 함수
x = df['Age']
df.loc[x.idxmax(), 'Name']

df_ex1.pivot_table('Age', index='Pclass', columns='Sex', 
                   aggfunc=lambda x: df_ex1.loc[x.idxmax(), 'Name'])

최고령자의 나이를 가진 행의 인덱스를 뽑아서, 그 인덱스로 인덱싱해서 이름 찾기.

+)추가 예시

# 15세 이하의 인원수를 lambda 함수로도 파악할 수 있다
df_ex3.pivot_table('Age', index='Pclass', columns='Sex', 
                   aggfunc=lambda x: (x <= 15).sum())
                   
# 15세 이하의 비율
df_ex3.pivot_table('Age', index='Pclass', aggfunc=lambda x: (x <= 15).mean())

pivot

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

이 함수는 aggfunc 안쓰고, 

처럼, 공통된 값이 없고, 하나씩 배정될때에, 값을 그냥 뽑아와서 테이블을 만들고 싶은 경우에 쓴다.