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를 지정할 수 있는데 칼럼으로 들어감

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로 상위에 있는 것을 올리고 내림.
|
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 칼럼을 올림
|
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 |
|
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])