반응형

/*********************************************************************************************************
-- Title : [Py2.7] Pandas.DataFrame 조작 - 피벗, 그룹핑, 집계, 그룹연산(groupby, pivot_table, margins, crosstab)
-- Reference : Python for Data Analysis
-- Key word : 피벗 pivot pivot_table 그룹핑 그룹 groupby stack unstack 카테고리 category fill_value 그룹연산 aggfunc 

                  margins 크로스탭 crosstab fillna pandas dataframe 데이터프레임
*********************************************************************************************************/


-- Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# -*- coding: utf-8 -*-
 
import os, sys
import pandas as pd
import json
import urllib2
from bs4 import BeautifulSoup
import numpy as np
 
# ********************************************
# -- 데이터 피벗(pivot_table) : 많이 쓰임!!!
# ********************************************
print("-" * 100 + "[3]"# ----- #
 
data = pd.read_excel("c:\\samples\\sales-funnel.xlsx")
print data.head(3)
 
# -- 명확화 위해 카테고리 변수화
data["Status"= data["Status"].astype("category")
data["Status"].cat.set_categories(["won","pending","declined"], inplace=True)
data.head(3)
 
print("-" * 100 + "[3.1]"# ----- #
 
# -- 피벗팅
#    그룹핑시 문자 컬럼은 사라짐, 디폴트는 avg이기에..
print pd.pivot_table(data, index=["Name"])
print pd.pivot_table(data, index=["Name""Rep""Manager"])
 
print("-" * 100 + "[3.2]"# ----- #
 
# -- 그룹핑 후 원하는 컬럼만 보기
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price"])
 
print("-" * 100 + "[3.3]"# ----- #
 
 
# ********************************************
# -- 그룹핑 시 집계합수 적용
# ********************************************
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price"], aggfunc=np.sum)
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price"], aggfunc=[np.mean, len])
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price""Price"], aggfunc=[np.mean, len])
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price""Quantity"], aggfunc=[np.mean, len])
 
print("-" * 100 + "[3.4]"# ----- #
 
 
# ********************************************
# -- 세로줄에 대한 계층
# ********************************************
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price"], columns=["Product"], aggfunc=np.sum)
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price""Quantity"], columns=["Product"], aggfunc=np.sum)
 
 
print("-" * 100 + "[3.5]"# ----- #
 
 
# ********************************************
# -- NULL 처리하기(fill_value)
# ********************************************
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price"], columns=["Product"], aggfunc=np.sum, fill_value=0)
print pd.pivot_table(data, index=["Manager""Rep"], values=["Price""Quantity"], columns=["Product"], aggfunc=np.sum, fill_value=0)
 
print("-" * 100 + "[3.6]"# ----- #
 
print pd.pivot_table(data, index=["Manager""Rep""Product"], values=["Price""Quantity"], aggfunc=np.sum, fill_value=0)
 
print("-" * 100 + "[3.7]"# ----- #
 
 
# ********************************************
# -- 전체 집계 추가(margins)
# ********************************************
# -- 하단에 전체 집계 추가
print pd.pivot_table(data, index=["Manager""Rep""Product"], values=["Price""Quantity"], aggfunc=[np.sum, np.mean], fill_value=0)
print pd.pivot_table(data, index=["Manager""Rep""Product"], values=["Price""Quantity"], aggfunc=[np.sum, np.mean], fill_value=0, margins=True)
 
print("-" * 100 + "[3.7]"# ----- #
 
 
# ********************************************
# -- values별 다른 집계 처리
# ********************************************
print pd.pivot_table(data, index=["Manager""Status"], values=["Quantity""Price"], columns=["Product"]
               , aggfunc={"Quantity"len"Price": [np.sum, np.mean]}, fill_value=0)
 
print("-" * 100 + "[3.8]"# ----- #
 
# -- 원하는 결과만 추출
table = pd.pivot_table(data, index=["Manager""Status"], columns=["Product"], values=["Quantity""Price"]
               , aggfunc={"Quantity"len"Price": [np.sum, np.mean]}, fill_value=0)
print table.head(5)
 
 
print table.query('Manager == ["Debra Henley"]')
print table.query('Status == ["pending", "won"]')
 
 
# ********************************************
# -- 데이터 피벗(crosstab) : 별로!!!
# ********************************************
print("-" * 100 + "[4]"# ----- #
 
# -- crosstab([가로줄 덩어리], [세로줄덩어리])
print pd.crosstab([data["Manager"], data["Rep"]], [data["Price"], data["Quantity"]])
print pd.crosstab([data["Manager"], data["Rep"]], [data["Price"], data["Quantity"]], margins=True)
print pd.crosstab([data["Manager"], data["Rep"]], [data["Price"]]
            , values=data["Price"], aggfunc=[len, np.mean], margins=True)
 
print("-" * 100 + "[4.1]"# ----- #
 
# -- NULL 처리(flii_value없음, fillna사용)
print pd.crosstab([data["Manager"], data["Rep"]], [data["Price"]]
            , values=data["Price"], aggfunc=[len, np.mean], margins=True).fillna(0)
 
 
# ********************************************
# -- 데이터 재형성(stack, unstack) : 거의 안 쓰임!!!
# ********************************************
print("-" * 100 + "[4.2]"# ----- #
 
# Row Multi-Index
row_idx_arr = list(zip(['r0''r0'], ['r-00''r-01']))
row_idx = pd.MultiIndex.from_tuples(row_idx_arr)
 
# Column Multi-Index
col_idx_arr = list(zip(['c0''c0''c1'], ['c-00''c-01''c-10']))
col_idx = pd.MultiIndex.from_tuples(col_idx_arr)
 
# Create the DataFrame
= pd.DataFrame(np.arange(6).reshape(23), index=row_idx, columns=col_idx)
= d.applymap(lambda x: (x // 3, x % 3))
 
# Stack/Unstack
= d.stack()
= d.unstack()
 
print d
print s
print u
 
 
# ********************************************
# -- 그룹연산(groupby) : R에서도 많이 쓰임!!!
# ********************************************
print("-" * 100 + "[5]"# ----- #
 
import dateutil
 
data = pd.DataFrame.from_csv("c:\\samples\\phone_data.csv")
print data.head(3)
 
# -- 날짜 컬럼 자동 정규화 : datautil.parser.parse사용
data["date"= data["date"].apply(dateutil.parser.parse, dayfirst=True)
print data.head(3)
 
print("-" * 100 + "[5.1]"# ----- #
 
# -- 날짜 컬럼 자동 정규화 : pd.datetime.strptime 사용
data_path = "c:\\samples\\phone_data.csv"
data = pd.DataFrame.from_csv(data_path)
dates = data["date"]
 
dateparse = lambda dates: [pd.datetime.strptime(d, "%y/%m/%d %H:%M"for d in dates]
 
data = pd.read_csv(data_path, parse_dates=["date"], date_parser=dateparse)
print data.head(3)
 
print("-" * 100 + "[5.2]"# ----- #
 
# -- 전체 gropuby 연산
print data["item"].count()
print data["duration"].max()
print data[data.item=="call"].max()
print data["duration"][data.item=="call"].sum()
 
# -- groupby
data.groupby(["month"]).groups.keys()       # group key 보기
data.groupby(["month"]).groups.values()     # group value 보기
data.groupby(["month"]).groups["2014-11"]
 
for name, group in data.groupby(["month"]):
    print str(name) + "  ||   " + str(group)
 
# -- groupby 연산
print data.groupby(["month"]).first()   # group별 최초 값 호출
print data.groupby(["month"]).mean()    # 숫자인 컬럼의 평균
print data.groupby(["month"]).sum()
print data.groupby(["month","item"]).sum()
 
# -- groupby 컬럼별 연산
print data.groupby(["month"])["date"].count()
print data[data["item"]=="call"].groupby("network")["duration"].sum()
 
# -- 여러 컬럼 groupby
print data.groupby(["month""item"]).count()
print data.groupby(["month""item"])["date"].count()
print data.groupby(["month""network_type"])["date"].count()
 
# -- 컬럼별 다른 연산(agg)
print data.groupby(["month""item"]).agg({"duration":sum, "network_type":"count""date":"first"}) # 아래 pivot_table과 동일
print pd.pivot_table(data, index=["month""item"], aggfunc={"duration":sum, "network_type":"count""date":"first"})
 
 


-- 샘플 파일


반응형

+ Recent posts