使用povit_table函数创建透视表
- 准备数据
准备数据meal_order_info.csv,并将meal_order_info.csv数据放到Linux本地/course/DataAnalyze/data目录。
- 使用povit_table函数创建透视表
- 使用订单详情表制作简单透视表,通过设定index参数示例,如代码 41所示。
In[1]: | import pandas as pd import numpy as np import os os.chdir(‘/course/DataAnalyze/data’) detail= pd.read_csv ('meal_order_detail1.csv') detailPivot = pd.pivot_table(detail[['order_id','counts','amounts']],index = 'order_id') print('以order_id作为分组键创建的订单透视表为:\n',detailPivot.head()) |
Out[1]: | 以 order_id 作为分组键创建的订单透视表为: amounts counts order_id 137 32.333333 1.500000 165 52.944444 1.166667 166 48.200000 1.400000 171 36.285714 1.428571 177 34.250000 1.000000 |
- 由结果可以看出在不特殊指定聚合函数aggfunc时,会默认使用numpy.mean进行聚合运算,numpy.mean会自动过滤掉非数值类型数据。可以通过指定aggfunc参数修改聚合函数,示例如代码 42所示。
In[2]: | detailPivot1 = pd.pivot_table(detail[['order_id','counts','amounts']], index = 'order_id',aggfunc = np.sum) print('以order_id作为分组键创建的订单销量与售价总和透视表为:\n',detailPivot1.head()) |
Out[2]: | 以 order_id 作为分组键创建的订单销量与售价总和透视表为: amounts counts order_id 137 194 9 165 953 21 166 241 7 171 254 10 177 137 4 |
- 和groupby方法分组的时候相同,pivot_table函数在创建透视表的时候分组键index可以有多个,示例如代码 43所示。
In[3]: | detailPivot2 = pd.pivot_table(detail[['order_id','dishes_name','counts','amounts']], index = ['order_id','dishes_name'],aggfunc = np.sum) print('以order_id和dishes_name作为分组键创建的订单销量与售价总和透视表为:\n', detailPivot2.head()) |
Out[3]: | 以 order_id 和 dishes_name 作为分组键创建的订单销量与售价总和透视表为: amounts counts order_id dishes_name 137 农夫山泉NFC果汁100%橙汁 6 1 凉拌菠菜 27 1 番茄炖牛腩 35 1 白饭/小碗 1 4 西瓜胡萝卜沙拉 26 1 |
- 通过设置columns参数,指定列分组,示例如代码 44所示。
In[3]: | detailPivot2 = pd.pivot_table(detail[['order_id','dishes_name','counts','amounts']], index = 'order_id',columns = 'dishes_name',aggfunc = np.sum) print('以order_id和dishes_name作为行列分组键创建的透视表前5行4列为:\n', detailPivot2.iloc[:5,:4]) |
Out[3]: | 以 order_id 和 dishes_name 作为行列分组键创建的透视表前 5 行 4 列为: amounts dishes_name 42度海之蓝 北冰洋汽水 38度剑南春 50度古井贡酒 order_id 137 NaN NaN NaN NaN 165 NaN NaN 80.0 NaN 166 NaN NaN NaN NaN 171 NaN NaN NaN NaN 177 NaN NaN NaN NaN |
- 当全部数据列数很多时,只想要显示自己关心的列,可以通过指定values参数来实现,如代码 45所示。
In[4]: | detailPivot4 = pd.pivot_table(detail[['order_id','dishes_name','counts','amounts']], index = 'order_id', values = 'counts', aggfunc = np.sum) print('以order_id作为行分组键counts作为值创建的透视表前5行为:\n', detailPivot4.head()) |
Out[4]: | 以order_id作为行分组键counts作为值创建的透视表前5行为: counts order_id 1002 7.0 1003 10.0 1004 17.0 1008 5.0 1011 10.0 |
- 通过代码 45可以看出,当某些数据不存在时,会自动填充NaN,因此可以指定fill_value参数,表示当存在缺失值时,以指定数值进行填充,如代码 46所示。
In[5]: | detailPivot5 = pd.pivot_table(detail[['order_id','dishes_name','counts','amounts']], index = 'order_id',columns = 'dishes_name', aggfunc = np.sum,fill_value = 0) print('空值填0后以order_id和dishes_name为行列分组键创建透视表前5行4列为:\n', detailPivot5.iloc[:5,:4]) |
Out[5]: | 空值填0后以order_id和dishes_name为行列分组键创建透视表前5行4列为: amounts dishes_name 42度海之蓝北冰洋汽水 38度剑南春 50度古井贡酒 order_id 1002 0 0 0 0 1003 0 0 0 0 1004 0 0 0 0 1008 0 0 0 0 1011 99 0 0 0 |
- 此外,还可以可以更改margins参数,查看汇总数据,如代码 47所示。
In[6]: | detailPivot6 = pd.pivot_table(detail[['order_id','dishes_name','counts','amounts']], index = 'order_id',columns = 'dishes_name', aggfunc = np.sum,fill_value = 0,margins = True) print('添加margins后以order_id和dishes_name为分组键的透视表前5行后4列为:\n', detailPivot6.iloc[:5,-4:]) |
Out[6]: | 添加margins后以order_id和dishes_name为分组键的透视表前5行后4列为: counts dishes_name黄油曲奇饼干黄花菜炒木耳黑米恋上葡萄 All order_id 1002 0.0 0.0 0.0 7.0 1003 0.0 0.0 0.0 10.0 1004 0.0 1.0 0.0 17.0 1008 0.0 0.0 0.0 5.0 1011 0.0 0.0 0.0 10.0 |