[파이썬] 데이터변형 | 재구조화 (피벗테이블)

2020. 4. 18. 13:28노트/Python : 프로그래밍

예제 데이터

import pandas as pd
import numpy as np

mul_index = pd.MultiIndex.from_tuples([('cust_1','2020'), ('cust_1','2021'),
                                      ('cust_2','2020'), ('cust_2','2021')])
data = pd.DataFrame(data=np.arange(16).reshape(4,4),
                   index = mul_index, 
                    columns = ['prd_1','prd_2','prd_3','prd_4'],
                    dtype='int')

  • 데이터를 재구조화 할때 사용하는 함수 
    - pivot, pivot_table

    - melt 
    - stack, unstack 

 

  • stack : 데이터의 칼럼을 로우로 피벗(또는 회전) 시킨다. 
  • unstack : 로우를 칼럼으로 피벗(또는 회전) 시킨다. 

# 멀티인덱스 확인하기 
datastacked=data.stack()
datastacked.index

MultiIndex([('cust_1', '2020', 'prd_1'),
            ('cust_1', '2020', 'prd_2'),
            ('cust_1', '2020', 'prd_3'),
            ('cust_1', '2020', 'prd_4'),
            ('cust_1', '2021', 'prd_1'),
            ('cust_1', '2021', 'prd_2'),
            ('cust_1', '2021', 'prd_3'),
            ('cust_1', '2021', 'prd_4'),
            ('cust_2', '2020', 'prd_1'),
            ('cust_2', '2020', 'prd_2'),
            ('cust_2', '2020', 'prd_3'),
            ('cust_2', '2020', 'prd_4'),
            ('cust_2', '2021', 'prd_1'),
            ('cust_2', '2021', 'prd_2'),
            ('cust_2', '2021', 'prd_3'),
            ('cust_2', '2021', 'prd_4')],
           )

 

  • pandas.pivot_table(data, values=Noneindex=None, columns=Noneaggfunc='mean'fill_value=Nonemargins=Falsedropna=Truemargins_name='All'observed=False)

https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html?highlight=pivot_table#pandas.pivot_table

 

타이타닉 데이터 예제

path = "C:\\Users\\student\\Desktop\\DY\\★ 데이터\\102. ex_sample_Python\\"
train = pd.read_csv(path+"train.csv")
train

train.pivot_table(index=["Sex"])

#성별, 선실등급별 생존률
train.pivot_table(index=["Sex","Pclass"],values="Survived",aggfunc=np.mean)

 

 

groupby 메카닉 

# 성별로 구분(groupby), 생존여부(survived)에 대해 describe
train.groupby("Sex")[["Survived"]].describe()

 

import pandas as pd
import numpy as np
df = pd.DataFrame({'key1':['a','a','b','b','a'],
                  'key2':['one','two','one','two','one'],
                  'data1': np.random.randn(5),
                  'data2': np.random.randn(5)})

df['data1'].groupby([df['key1'],df['key2']]).mean()

df.groupby(['key1','key2']).mean()

df['data1'].groupby([df['key1'],df['key2']]).mean().unstack()

 

Melt 함수 

 

  • pandas.melt(frame: pandas.core.frame.DataFrame, id_vars=None, value_vars=None, var_name=Nonevalue_name='value'col_level=None) 

 

#구분자 컬럼 지정 "key 기준"
pd.melt(df, id_vars=['key'],value_vars=["A","B","C"]) 
# 기준 열에 대해 다른 열의 값을 나타낸다.

 

 

참고 

파이썬 라이브러리를 활용한 데이터 분석(2판) p334~p345 , p387~p389