pandas 사용

melt

1
2
3
4
5
6
ser_1 = pd.Series([2, 5, 3, 4, 6, 2, 3])
ser_2 = pd.Series([7, 3, 6, 5, 2, 6, 7])
ser_3 = pd.Series([9, 11, 4, 8, 2, 15, 3])

df_aov = pd.DataFrame([ser_1, ser_2, ser_3]).transpose().melt()
df_aov

` id_vars로 id를 지정할 수 있는데 칼럼으로 들어감

image

cut

값을 기반으로 이산화

1
pd.cut([5, 20, 29, 33, 41], bins = 5, right = False)
[[5.0, 12.2), [19.4, 26.6), [26.6, 33.8), [26.6, 33.8), [33.8, 41.036)]
Categories (5, interval[float64]): [[5.0, 12.2) < [12.2, 19.4) < [19.4, 26.6) < [26.6, 33.8) < [33.8, 41.036)]

qcut

특정 분위수를 계산해 이산화

1
pd.qcut([5, 20, 29, 33, 41], [0,0.2,0.4,0.6,0.8,1])
[(4.999, 17.0], (17.0, 25.4], (25.4, 30.6], (30.6, 34.6], (34.6, 41.0]]
Categories (5, interval[float64]): [(4.999, 17.0] < (17.0, 25.4] < (25.4, 30.6] < (30.6, 34.6] < (34.6, 41.0]]

재구조화 : pivot_table

pd.pivot_table(data, index, columns, values, aggfunc)

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd

data = pd.DataFrame({'cust_id': ['c1', 'c1', 'c1', 'c2', 'c2', 'c2', 'c3', 'c3', 'c3'],
'prod_cd': ['p1', 'p2', 'p3', 'p1', 'p2', 'p3', 'p1', 'p2', 'p3'],
'grade' : ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B'],
 'pch_amt': [30, 10, 0, 40, 15, 30, 0, 0, 10]})
data

cust_id prod_cd grade pch_amt
0 c1 p1 A 30
1 c1 p2 A 10
2 c1 p3 A 0
3 c2 p1 A 40
4 c2 p2 A 15
5 c2 p3 A 30
6 c3 p1 B 0
7 c3 p2 B 0
8 c3 p3 B 10
1
data.pivot(index='cust_id', columns='prod_cd', values='pch_amt')

prod_cd p1 p2 p3
cust_id
c1 30 10 0
c2 40 15 30
c3 0 0 10
  • aggfuc : 중복되는 값이 여러 개 있을 경우 집계할 수 있는 함수 제공
1
pd.pivot_table(data, index='grade', columns='prod_cd', values='pch_amt', aggfunc=np.mean)

prod_cd p1 p2 p3 All
grade
A 35.000000 12.500000 15.000000 20.833333
B 0.000000 0.000000 10.000000 3.333333
All 23.333333 8.333333 13.333333 15.000000
  • margins=True : 모든 행과 열 기준으로 집계
1
pd.pivot_table(data, index='grade', columns='prod_cd', values='pch_amt', aggfunc=np.sum, margins=True)

prod_cd p1 p2 p3 All
grade
A 70 25 30 125
B 0 0 10 10
All 70 25 40 135


stack, unstack

  • stack : 위에서 아래로 쌓는 것
  • unstack 쌓은 것을 왼쪽에서 오른쪽으로 늘어놓는 것
1
2
3
4
mul_index = pd.MultiIndex.from_tuples([('cust_1', '2015'), ('cust_1', '2016'),('cust_2', '2015'), ('cust_2', '2016')])
data = pd.DataFrame(data=np.arange(16).reshape(4, 4),
        index=mul_index,columns=['prd_1', 'prd_2', 'prd_3', 'prd_4'], dtype='int')
data

prd_1 prd_2 prd_3 prd_4
cust_1 2015 0 1 2 3
2016 4 5 6 7
cust_2 2015 8 9 10 11
2016 12 13 14 15
1
data.stack(level = -1, dropna=False)
cust_1  2015  prd_1     0
              prd_2     1
              prd_3     2
              prd_4     3
        2016  prd_1     4
              prd_2     5
              prd_3     6
              prd_4     7
cust_2  2015  prd_1     8
              prd_2     9
              prd_3    10
              prd_4    11
        2016  prd_1    12
              prd_2    13
              prd_3    14
              prd_4    15
dtype: int32
  • level은 default로 -1로 상위에 있는 것을 올리고 내림.
1
data.unstack(level=-1)

prd_1 prd_2 prd_3 prd_4
2015 2016 2015 2016 2015 2016 2015 2016
cust_1 0 4 1 5 2 6 3 7
cust_2 8 12 9 13 10 14 11 15
  • level이 0 이상 숫자 : 왼쪽에서 숫자만큼의 index 칼럼을 올림
1
data.unstack(level=0)

prd_1 prd_2 prd_3 prd_4
cust_1 cust_2 cust_1 cust_2 cust_1 cust_2 cust_1 cust_2
2015 0 8 1 9 2 10 3 11
2016 4 12 5 13 6 14 7 15
1
data.unstack(level=1)

prd_1 prd_2 prd_3 prd_4
2015 2016 2015 2016 2015 2016 2015 2016
cust_1 0 4 1 5 2 6 3 7
cust_2 8 12 9 13 10 14 11 15

multi index 교차표

pd.crosstab([id1, id2], [col1, col2])

updatedupdated2021-03-242021-03-24
Load Comments?