pandas pivot_table 活学活用实例教程

pandas pivot_table 活学活用实例教程

  • pandas pivot_table 活学活用实例教程
    • 导入相关数据分析的库
    • 首先进行commentTime时间进行数据预处理
    • 查看数据类型信息
    • 最简单的透视表
    • 直接敲击该函数在notebook中可以查看该函数的参数
    • 多个索引列
    • 特定列的统计
    • 规定特定的聚合函数
    • 传入多个聚合函数
    • 传入columns参数
    • 生成的DataFrame可以导出excel或csv文件
    • 修改index中的数据类型,显示完整的索引列
    • 传入fill_value参数处理缺失值
    • 设添加margins参数,定margin_name名称
    • aggfunc传入字典,规定单个字段对应的聚合函数
    • 可以使用query 进行查询数据
    • 高级的透视表查询语句
  • 至此,pandas中的透视表的功能实例实现完成

pandas pivot_table 活学活用实例教程

导入相关数据分析的库

import pandas as pd
import numpy as np
import  matplotlib.pyplot as  plt
import time
df=pd.read_excel("all_data_meituan.xlsx")
df=df[['commentTime','menu','readCnt','star','userId','userLevel','zanCnt']].dropna()
# 这里去掉缺失值,因为后面的透视表中的处理都是直接去除缺失值(dropna=True),这边我们先处理掉,以免与后面的结果发生了矛盾,还要分析问题在哪里。
df.head() # 看出前5行
commentTime menu readCnt star userId userLevel zanCnt
0 1525875708515 单人午晚餐 25434 40 291754497 1 2
1 1527853291658 2人午晚餐 7293 40 829297130 2 0
2 1522813943711 2人午晚餐 31787 50 38217090 4 2
3 1525165942926 单人午晚餐 10334 20 67726205 5 1
4 1526546884897 单人午晚餐 5658 30 93974894 3 0

首先进行commentTime时间进行数据预处理


def convertTime(x):
    y=time.localtime(x/1000)
    z=time.strftime("%Y-%m-%d %H:%M:%S",y)
    return z
df["commentTime"]=df["commentTime"].apply(convertTime)

df.head()
commentTime menu readCnt star userId userLevel zanCnt
0 2018-05-09 22:21:48 单人午晚餐 25434 40 291754497 1 2
1 2018-06-01 19:41:31 2人午晚餐 7293 40 829297130 2 0
2 2018-04-04 11:52:23 2人午晚餐 31787 50 38217090 4 2
3 2018-05-01 17:12:22 单人午晚餐 10334 20 67726205 5 1
4 2018-05-17 16:48:04 单人午晚餐 5658 30 93974894 3 0

查看数据类型信息

df.info()

Int64Index: 17223 entries, 0 to 199
Data columns (total 7 columns):
commentTime    17223 non-null object
menu           17223 non-null object
readCnt        17223 non-null int64
star           17223 non-null int64
userId         17223 non-null int64
userLevel      17223 non-null int64
zanCnt         17223 non-null int64
dtypes: int64(5), object(2)
memory usage: 1.1+ MB

最简单的透视表

# 下面使用pandas中我们在前面的数据分析中未使用到的一个大的模块,透视表pivot_table
pd.pivot_table(df,index=['menu'])
readCnt star userId userLevel zanCnt
menu
2人午晚餐 1592.576047 37.404450 3.195518e+08 2.269764 0.073691
4人午/晚自助 1378.817837 37.311828 2.507373e+08 2.565465 0.041746
6人午/晚自助 999.232742 42.149901 3.469539e+08 3.130178 0.047337
单人下午自助烤肉 3722.082942 34.162754 3.821938e+08 1.654147 0.574335
单人午/晚自助 1618.223881 42.985075 2.580148e+08 2.597015 0.000000
单人午晚餐 1733.297959 37.357143 3.197547e+08 2.393367 0.105867
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 137.885167 41.004785 2.346154e+08 2.473684 0.000000
周一至周五自助烤肉,免费WiFi 74.181818 50.000000 3.153784e+08 0.545455 0.000000
学生专享午晚自助 1501.586050 38.669447 3.725546e+08 2.309704 0.090599

直接敲击该函数在notebook中可以查看该函数的参数

# 查看函数的参数以及默认参数,其中aggfunc意思是透视表使用的聚类分析方法,这种简单的透视表我们可以通过groupby实现,df.groupby('menu').mean()
#  这里针对的数值型字段,比如我们在预处理中的评论时间字段并没有出现求平均的结果 
pd.pivot_table  

多个索引列

# 实际上单个索引的pivot_table 与groupby得到的结果一样,可以这样说,pivot_table是高级版本的groupby,提供了很多groupby不能实现的功能
# 多索引,通过列表传入
pd.pivot_table(df,index=['menu','star'])
# 发现一个问题,star索引列中的数据显示不全,有的menu评分不全,不过这并不影响我们进行分析
# 加入star列类型是int类型的话,会有显示不全的信息,但是将star列转化为category类之后,数据显示完整,后文有示例
# 发现每个menu重的点赞的平均数在评分位10分的最高,也就是浏览评论数据的人中给10分的评价点赞数最多,很可能是因为一针见血的指出了该品类的真相。。
readCnt userId userLevel zanCnt
menu star
2人午晚餐 10 3209.762918 2.658655e+08 2.306991 0.486322
20 1332.634146 3.405706e+08 2.084428 0.026266
30 453.680819 3.168836e+08 2.031968 0.011489
40 1387.565459 3.124086e+08 2.258136 0.059172
50 2770.622104 3.345696e+08 2.556467 0.099421
4人午/晚自助 10 2894.969466 1.837606e+08 1.190840 0.305344
20 989.529412 7.500110e+07 2.058824 0.000000
30 608.138889 2.855711e+08 2.469907 0.000000
40 1413.608696 2.492934e+08 2.833333 0.014493
50 1651.925373 2.624418e+08 2.835821 0.037313
6人午/晚自助 10 2880.000000 1.417346e+08 3.000000 1.000000
30 1382.437500 3.574079e+08 2.321429 0.133929
40 475.014085 3.931602e+08 3.619718 0.000000
50 1066.473469 3.220952e+08 3.220408 0.004082
单人下午自助烤肉 10 3316.081633 8.303536e+08 1.408163 2.244898
20 1674.000000 0.000000e+00 0.000000 0.000000
30 3483.173077 3.891840e+08 1.423077 0.682692
40 4040.034722 1.299745e+08 1.833333 0.034722
50 4223.017751 3.738496e+08 2.124260 0.000000
单人午/晚自助 30 2424.000000 0.000000e+00 0.000000 0.000000
40 1600.037037 2.413956e+08 2.370370 0.000000
50 1366.000000 3.589771e+08 3.666667 0.000000
单人午晚餐 10 2107.811321 1.450798e+08 2.245283 0.754717
20 2236.238255 3.244870e+08 2.526846 0.473154
30 566.427984 2.748531e+08 2.153909 0.011523
40 2247.692881 3.391905e+08 2.437914 0.084437
50 2288.451967 3.638373e+08 2.588289 0.071363
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 1313.000000 5.211120e+08 2.000000 0.000000
30 71.260870 2.453638e+08 2.195652 0.000000
40 83.060606 1.129387e+08 2.484848 0.000000
50 79.632184 2.883081e+08 2.666667 0.000000
周一至周五自助烤肉,免费WiFi 50 74.181818 3.153784e+08 0.545455 0.000000
学生专享午晚自助 10 1331.108911 5.364212e+08 1.000000 0.207921
20 1602.905759 3.906107e+08 2.371728 0.104712
30 731.221172 3.847745e+08 1.809074 0.102079
40 1091.994759 2.895067e+08 2.679245 0.046122
50 2424.111240 4.336949e+08 2.347625 0.115875

特定列的统计

# 上面的分析中包含了多列的平均值,假如我们只想看其中的readCnt 列,可以传入values参数
pd.pivot_table(df,index=['menu','star'],values='readCnt')
readCnt
menu star
2人午晚餐 10 3209.762918
20 1332.634146
30 453.680819
40 1387.565459
50 2770.622104
4人午/晚自助 10 2894.969466
20 989.529412
30 608.138889
40 1413.608696
50 1651.925373
6人午/晚自助 10 2880.000000
30 1382.437500
40 475.014085
50 1066.473469
单人下午自助烤肉 10 3316.081633
20 1674.000000
30 3483.173077
40 4040.034722
50 4223.017751
单人午/晚自助 30 2424.000000
40 1600.037037
50 1366.000000
单人午晚餐 10 2107.811321
20 2236.238255
30 566.427984
40 2247.692881
50 2288.451967
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 1313.000000
30 71.260870
40 83.060606
50 79.632184
周一至周五自助烤肉,免费WiFi 50 74.181818
学生专享午晚自助 10 1331.108911
20 1602.905759
30 731.221172
40 1091.994759
50 2424.111240

规定特定的聚合函数

#  此时,我们也会考虑,这个地方是不是只能是平均值,回答当然是no,还可以通过aggfunc传入其他的参数,以获得不同的结果,例如
# 我们可以通过传入np.sum,函数,求总和
pd.pivot_table(df,index=['menu','star'],values='readCnt',aggfunc=np.sum)
readCnt
menu star
2人午晚餐 10 1056012
20 710294
30 908269
40 3751977
50 5740729
4人午/晚自助 10 379241
20 67288
30 262716
40 585234
50 885432
6人午/晚自助 10 23040
30 154833
40 67452
50 261286
单人下午自助烤肉 10 324976
20 33480
30 724500
40 581765
50 713690
单人午/晚自助 30 24240
40 43201
50 40980
单人午晚餐 10 223428
20 666399
30 688210
40 2715213
50 2501278
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 13130
30 3278
40 5482
50 6928
周一至周五自助烤肉,免费WiFi 50 1632
学生专享午晚自助 10 134442
20 306155
30 386816
40 1041763
50 2092008

传入多个聚合函数

#  aggfunc 可以传入多个参数
pd.pivot_table(df,index=['menu','star'],values='readCnt',aggfunc=[np.sum,len])
sum len
readCnt readCnt
menu star
2人午晚餐 10 1056012 329
20 710294 533
30 908269 2002
40 3751977 2704
50 5740729 2072
4人午/晚自助 10 379241 131
20 67288 68
30 262716 432
40 585234 414
50 885432 536
6人午/晚自助 10 23040 8
30 154833 112
40 67452 142
50 261286 245
单人下午自助烤肉 10 324976 98
20 33480 20
30 724500 208
40 581765 144
50 713690 169
单人午/晚自助 30 24240 10
40 43201 27
50 40980 30
单人午晚餐 10 223428 106
20 666399 298
30 688210 1215
40 2715213 1208
50 2501278 1093
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 13130 10
30 3278 46
40 5482 66
50 6928 87
周一至周五自助烤肉,免费WiFi 50 1632 22
学生专享午晚自助 10 134442 101
20 306155 191
30 386816 529
40 1041763 954
50 2092008 863
#  aggfunc 可以传入多个参数
pd.pivot_table(df,index=['menu','star'],values='readCnt',aggfunc=[np.sum,len,np.mean])
sum len mean
readCnt readCnt readCnt
menu star
2人午晚餐 10 1056012 329 3209.762918
20 710294 533 1332.634146
30 908269 2002 453.680819
40 3751977 2704 1387.565459
50 5740729 2072 2770.622104
4人午/晚自助 10 379241 131 2894.969466
20 67288 68 989.529412
30 262716 432 608.138889
40 585234 414 1413.608696
50 885432 536 1651.925373
6人午/晚自助 10 23040 8 2880.000000
30 154833 112 1382.437500
40 67452 142 475.014085
50 261286 245 1066.473469
单人下午自助烤肉 10 324976 98 3316.081633
20 33480 20 1674.000000
30 724500 208 3483.173077
40 581765 144 4040.034722
50 713690 169 4223.017751
单人午/晚自助 30 24240 10 2424.000000
40 43201 27 1600.037037
50 40980 30 1366.000000
单人午晚餐 10 223428 106 2107.811321
20 666399 298 2236.238255
30 688210 1215 566.427984
40 2715213 1208 2247.692881
50 2501278 1093 2288.451967
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 13130 10 1313.000000
30 3278 46 71.260870
40 5482 66 83.060606
50 6928 87 79.632184
周一至周五自助烤肉,免费WiFi 50 1632 22 74.181818
学生专享午晚自助 10 134442 101 1331.108911
20 306155 191 1602.905759
30 386816 529 731.221172
40 1041763 954 1091.994759
50 2092008 863 2424.111240

传入columns参数

# 同时我们可以利用columns传入参数,通常传入的都是category类型的字段,这样可以分析针对这个字段下,values对应列的各个aggfunc函数,例如
pd.pivot_table(df,index=['menu','star'],values='readCnt',columns='userLevel',aggfunc=[np.sum,len])
sum len
userLevel 0 1 2 3 4 5 6 0 1 2 3 4 5 6
menu star
2人午晚餐 10 258020.0 17404.0 556200.0 167428.0 56960.0 NaN NaN 50.0 19.0 100.0 100.0 60.0 NaN NaN
20 139630.0 70824.0 291639.0 143281.0 64920.0 NaN NaN 105.0 48.0 157.0 143.0 80.0 NaN NaN
30 136235.0 44579.0 74229.0 384310.0 256611.0 10165.0 2140.0 508.0 232.0 350.0 620.0 204.0 68.0 20.0
40 943979.0 143525.0 1037331.0 555754.0 1050919.0 12825.0 7644.0 479.0 282.0 678.0 694.0 481.0 78.0 12.0
50 1028106.0 910589.0 194753.0 1339691.0 2190625.0 9505.0 67460.0 207.0 237.0 441.0 725.0 351.0 67.0 44.0
4人午/晚自助 10 225540.0 NaN 137293.0 16408.0 NaN NaN NaN 60.0 NaN 57.0 14.0 NaN NaN NaN
20 20628.0 NaN NaN 15860.0 30800.0 NaN NaN 28.0 NaN NaN 20.0 20.0 NaN NaN
30 64636.0 NaN 36427.0 133200.0 18794.0 9659.0 NaN 72.0 NaN 133.0 138.0 58.0 31.0 NaN
40 272260.0 NaN 158807.0 56781.0 44983.0 NaN 52403.0 20.0 NaN 146.0 137.0 98.0 NaN 13.0
50 564533.0 NaN 25130.0 201899.0 77930.0 10240.0 5700.0 79.0 NaN 95.0 205.0 90.0 47.0 20.0
6人午/晚自助 10 NaN NaN NaN 23040.0 NaN NaN NaN NaN NaN NaN 8.0 NaN NaN NaN
30 7800.0 NaN 22551.0 81846.0 42636.0 NaN NaN 20.0 NaN 35.0 38.0 19.0 NaN NaN
40 NaN NaN 7345.0 11150.0 28780.0 20177.0 NaN NaN NaN 27.0 39.0 37.0 39.0 NaN
50 7560.0 NaN 11476.0 122220.0 38064.0 13086.0 68880.0 18.0 NaN 38.0 98.0 56.0 15.0 20.0
单人下午自助烤肉 10 NaN 196536.0 NaN 128440.0 NaN NaN NaN NaN 78.0 NaN 20.0 NaN NaN NaN
20 33480.0 NaN NaN NaN NaN NaN NaN 20.0 NaN NaN NaN NaN NaN NaN
30 615033.0 NaN 68015.0 472.0 40980.0 NaN NaN 101.0 NaN 65.0 2.0 40.0 NaN NaN
40 322580.0 28460.0 14442.0 205620.0 10663.0 NaN NaN 40.0 20.0 16.0 60.0 8.0 NaN NaN
50 22500.0 NaN 657928.0 18242.0 15020.0 NaN NaN 20.0 NaN 108.0 21.0 20.0 NaN NaN
单人午/晚自助 30 24240.0 NaN NaN NaN NaN NaN NaN 10.0 NaN NaN NaN NaN NaN NaN
40 NaN NaN 40681.0 2520.0 NaN NaN NaN NaN NaN 17.0 10.0 NaN NaN NaN
50 NaN NaN NaN 10760.0 30220.0 NaN NaN NaN NaN NaN 10.0 20.0 NaN NaN
单人午晚餐 10 89260.0 NaN NaN 75968.0 38200.0 20000.0 NaN 40.0 NaN NaN 36.0 20.0 10.0 NaN
20 26710.0 51900.0 359680.0 51328.0 166447.0 10334.0 NaN 30.0 40.0 80.0 40.0 107.0 1.0 NaN
30 122043.0 45679.0 111660.0 195120.0 167446.0 46262.0 NaN 289.0 96.0 289.0 267.0 228.0 46.0 NaN
40 160276.0 210574.0 108343.0 1961559.0 116063.0 158398.0 NaN 185.0 81.0 263.0 450.0 157.0 72.0 NaN
50 423175.0 532911.0 81259.0 1174165.0 80857.0 200272.0 8639.0 145.0 129.0 200.0 357.0 108.0 127.0 27.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 NaN NaN 13130.0 NaN NaN NaN NaN NaN NaN 10.0 NaN NaN NaN NaN
30 369.0 NaN 2144.0 765.0 NaN NaN NaN 3.0 NaN 28.0 15.0 NaN NaN NaN
40 1967.0 NaN NaN NaN 3515.0 NaN NaN 25.0 NaN NaN NaN 41.0 NaN NaN
50 1602.0 NaN 1387.0 2148.0 840.0 951.0 NaN 18.0 NaN 15.0 28.0 12.0 14.0 NaN
周一至周五自助烤肉,免费WiFi 50 420.0 1212.0 NaN NaN NaN NaN NaN 10.0 12.0 NaN NaN NaN NaN NaN
学生专享午晚自助 10 67546.0 40276.0 6538.0 20082.0 NaN NaN NaN 37.0 42.0 7.0 15.0 NaN NaN NaN
20 89080.0 NaN 54380.0 147675.0 NaN 15020.0 NaN 40.0 NaN 40.0 91.0 NaN 20.0 NaN
30 38524.0 175981.0 119230.0 43321.0 4340.0 5420.0 NaN 134.0 77.0 134.0 144.0 20.0 20.0 NaN
40 95021.0 56070.0 290879.0 193114.0 379548.0 27131.0 NaN 105.0 49.0 209.0 346.0 174.0 71.0 NaN
50 102935.0 NaN 812392.0 302126.0 734360.0 8620.0 131575.0 189.0 NaN 269.0 210.0 136.0 40.0 19.0

生成的DataFrame可以导出excel或csv文件

# pd.pivot_table(df,index=['menu','star'],values='readCnt',columns='userLevel',aggfunc=[np.sum,len]).to_excel('pivot_table.xlsx')
# 这里生成的是DataFrame结构,可以直接将结果导出生成excel或者csv文件

修改index中的数据类型,显示完整的索引列

#  我们可以总结一下,index中一般是category类型,columns也是category类型,当然可以是能够代表category的数值,比如这里的离散数值,
#  values中一般是数值类型,aggfunc针对values中的值进行计算,这里我们可以
# 更改index与columns中的字段,并通过数据类型的变换,则可以将index中显示不全的信息显示完整。
df['menu']=df['menu'].astype('category')
df['userLevel']=df['userLevel'].astype('category')
df['star']=df['star'].astype('category')
pd.pivot_table(df,index=['menu','userLevel'],values='readCnt',columns='star',aggfunc=[np.sum,len])
sum len
star 10 20 30 40 50 10 20 30 40 50
menu userLevel
2人午晚餐 0 258020.0 139630.0 136235.0 943979.0 1028106.0 50.0 105.0 508.0 479.0 207.0
1 17404.0 70824.0 44579.0 143525.0 910589.0 19.0 48.0 232.0 282.0 237.0
2 556200.0 291639.0 74229.0 1037331.0 194753.0 100.0 157.0 350.0 678.0 441.0
3 167428.0 143281.0 384310.0 555754.0 1339691.0 100.0 143.0 620.0 694.0 725.0
4 56960.0 64920.0 256611.0 1050919.0 2190625.0 60.0 80.0 204.0 481.0 351.0
5 NaN NaN 10165.0 12825.0 9505.0 NaN NaN 68.0 78.0 67.0
6 NaN NaN 2140.0 7644.0 67460.0 NaN NaN 20.0 12.0 44.0
4人午/晚自助 0 225540.0 20628.0 64636.0 272260.0 564533.0 60.0 28.0 72.0 20.0 79.0
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 137293.0 NaN 36427.0 158807.0 25130.0 57.0 NaN 133.0 146.0 95.0
3 16408.0 15860.0 133200.0 56781.0 201899.0 14.0 20.0 138.0 137.0 205.0
4 NaN 30800.0 18794.0 44983.0 77930.0 NaN 20.0 58.0 98.0 90.0
5 NaN NaN 9659.0 NaN 10240.0 NaN NaN 31.0 NaN 47.0
6 NaN NaN NaN 52403.0 5700.0 NaN NaN NaN 13.0 20.0
6人午/晚自助 0 NaN NaN 7800.0 NaN 7560.0 NaN NaN 20.0 NaN 18.0
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN 22551.0 7345.0 11476.0 NaN NaN 35.0 27.0 38.0
3 23040.0 NaN 81846.0 11150.0 122220.0 8.0 NaN 38.0 39.0 98.0
4 NaN NaN 42636.0 28780.0 38064.0 NaN NaN 19.0 37.0 56.0
5 NaN NaN NaN 20177.0 13086.0 NaN NaN NaN 39.0 15.0
6 NaN NaN NaN NaN 68880.0 NaN NaN NaN NaN 20.0
单人下午自助烤肉 0 NaN 33480.0 615033.0 322580.0 22500.0 NaN 20.0 101.0 40.0 20.0
1 196536.0 NaN NaN 28460.0 NaN 78.0 NaN NaN 20.0 NaN
2 NaN NaN 68015.0 14442.0 657928.0 NaN NaN 65.0 16.0 108.0
3 128440.0 NaN 472.0 205620.0 18242.0 20.0 NaN 2.0 60.0 21.0
4 NaN NaN 40980.0 10663.0 15020.0 NaN NaN 40.0 8.0 20.0
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
单人午/晚自助 0 NaN NaN 24240.0 NaN NaN NaN NaN 10.0 NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ...
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
单人午晚餐 0 89260.0 26710.0 122043.0 160276.0 423175.0 40.0 30.0 289.0 185.0 145.0
1 NaN 51900.0 45679.0 210574.0 532911.0 NaN 40.0 96.0 81.0 129.0
2 NaN 359680.0 111660.0 108343.0 81259.0 NaN 80.0 289.0 263.0 200.0
3 75968.0 51328.0 195120.0 1961559.0 1174165.0 36.0 40.0 267.0 450.0 357.0
4 38200.0 166447.0 167446.0 116063.0 80857.0 20.0 107.0 228.0 157.0 108.0
5 20000.0 10334.0 46262.0 158398.0 200272.0 10.0 1.0 46.0 72.0 127.0
6 NaN NaN NaN NaN 8639.0 NaN NaN NaN NaN 27.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 NaN NaN 369.0 1967.0 1602.0 NaN NaN 3.0 25.0 18.0
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN 13130.0 2144.0 NaN 1387.0 NaN 10.0 28.0 NaN 15.0
3 NaN NaN 765.0 NaN 2148.0 NaN NaN 15.0 NaN 28.0
4 NaN NaN NaN 3515.0 840.0 NaN NaN NaN 41.0 12.0
5 NaN NaN NaN NaN 951.0 NaN NaN NaN NaN 14.0
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
周一至周五自助烤肉,免费WiFi 0 NaN NaN NaN NaN 420.0 NaN NaN NaN NaN 10.0
1 NaN NaN NaN NaN 1212.0 NaN NaN NaN NaN 12.0
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
学生专享午晚自助 0 67546.0 89080.0 38524.0 95021.0 102935.0 37.0 40.0 134.0 105.0 189.0
1 40276.0 NaN 175981.0 56070.0 NaN 42.0 NaN 77.0 49.0 NaN
2 6538.0 54380.0 119230.0 290879.0 812392.0 7.0 40.0 134.0 209.0 269.0
3 20082.0 147675.0 43321.0 193114.0 302126.0 15.0 91.0 144.0 346.0 210.0
4 NaN NaN 4340.0 379548.0 734360.0 NaN NaN 20.0 174.0 136.0
5 NaN 15020.0 5420.0 27131.0 8620.0 NaN 20.0 20.0 71.0 40.0
6 NaN NaN NaN NaN 131575.0 NaN NaN NaN NaN 19.0

63 rows × 10 columns

传入fill_value参数处理缺失值

# 上面的例子虽然将index显示完整了,但是仍然有很多缺失值NaN(not a number),显示在这里给人感觉不舒服的话,可以在参数中传入fill_value,例如
pd.pivot_table(df,index=['userLevel','menu'],values='readCnt',columns='star',aggfunc=[np.sum,len],fill_value=0)
sum len
star 10 20 30 40 50 10 20 30 40 50
userLevel menu
0 2人午晚餐 258020 139630 136235 943979 1028106 50 105 508 479 207
4人午/晚自助 225540 20628 64636 272260 564533 60 28 72 20 79
6人午/晚自助 0 0 7800 0 7560 0 0 20 0 18
单人下午自助烤肉 0 33480 615033 322580 22500 0 20 101 40 20
单人午/晚自助 0 0 24240 0 0 0 0 10 0 0
单人午晚餐 89260 26710 122043 160276 423175 40 30 289 185 145
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 369 1967 1602 0 0 3 25 18
周一至周五自助烤肉,免费WiFi 0 0 0 0 420 0 0 0 0 10
学生专享午晚自助 67546 89080 38524 95021 102935 37 40 134 105 189
1 2人午晚餐 17404 70824 44579 143525 910589 19 48 232 282 237
4人午/晚自助 0 0 0 0 0 0 0 0 0 0
6人午/晚自助 0 0 0 0 0 0 0 0 0 0
单人下午自助烤肉 196536 0 0 28460 0 78 0 0 20 0
单人午/晚自助 0 0 0 0 0 0 0 0 0 0
单人午晚餐 0 51900 45679 210574 532911 0 40 96 81 129
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 0 0 0 0 0 0 0
周一至周五自助烤肉,免费WiFi 0 0 0 0 1212 0 0 0 0 12
学生专享午晚自助 40276 0 175981 56070 0 42 0 77 49 0
2 2人午晚餐 556200 291639 74229 1037331 194753 100 157 350 678 441
4人午/晚自助 137293 0 36427 158807 25130 57 0 133 146 95
6人午/晚自助 0 0 22551 7345 11476 0 0 35 27 38
单人下午自助烤肉 0 0 68015 14442 657928 0 0 65 16 108
单人午/晚自助 0 0 0 40681 0 0 0 0 17 0
单人午晚餐 0 359680 111660 108343 81259 0 80 289 263 200
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 13130 2144 0 1387 0 10 28 0 15
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 0 0 0 0 0
学生专享午晚自助 6538 54380 119230 290879 812392 7 40 134 209 269
3 2人午晚餐 167428 143281 384310 555754 1339691 100 143 620 694 725
4人午/晚自助 16408 15860 133200 56781 201899 14 20 138 137 205
6人午/晚自助 23040 0 81846 11150 122220 8 0 38 39 98
... ... ... ... ... ... ... ... ... ... ...
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 765 0 2148 0 0 15 0 28
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 0 0 0 0 0
学生专享午晚自助 20082 147675 43321 193114 302126 15 91 144 346 210
4 2人午晚餐 56960 64920 256611 1050919 2190625 60 80 204 481 351
4人午/晚自助 0 30800 18794 44983 77930 0 20 58 98 90
6人午/晚自助 0 0 42636 28780 38064 0 0 19 37 56
单人下午自助烤肉 0 0 40980 10663 15020 0 0 40 8 20
单人午/晚自助 0 0 0 0 30220 0 0 0 0 20
单人午晚餐 38200 166447 167446 116063 80857 20 107 228 157 108
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 3515 840 0 0 0 41 12
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 0 0 0 0 0
学生专享午晚自助 0 0 4340 379548 734360 0 0 20 174 136
5 2人午晚餐 0 0 10165 12825 9505 0 0 68 78 67
4人午/晚自助 0 0 9659 0 10240 0 0 31 0 47
6人午/晚自助 0 0 0 20177 13086 0 0 0 39 15
单人下午自助烤肉 0 0 0 0 0 0 0 0 0 0
单人午/晚自助 0 0 0 0 0 0 0 0 0 0
单人午晚餐 20000 10334 46262 158398 200272 10 1 46 72 127
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 0 951 0 0 0 0 14
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 0 0 0 0 0
学生专享午晚自助 0 15020 5420 27131 8620 0 20 20 71 40
6 2人午晚餐 0 0 2140 7644 67460 0 0 20 12 44
4人午/晚自助 0 0 0 52403 5700 0 0 0 13 20
6人午/晚自助 0 0 0 0 68880 0 0 0 0 20
单人下午自助烤肉 0 0 0 0 0 0 0 0 0 0
单人午/晚自助 0 0 0 0 0 0 0 0 0 0
单人午晚餐 0 0 0 0 8639 0 0 0 0 27
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 0 0 0 0 0 0 0
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 0 0 0 0 0
学生专享午晚自助 0 0 0 0 131575 0 0 0 0 19

63 rows × 10 columns

设添加margins参数,定margin_name名称

pd.pivot_table(df,index=['userLevel','menu'],values='readCnt',columns='star',aggfunc=[len],fill_value=0,margins=True,margins_name='总计')
# 显示总计
len
star 10 20 30 40 50 总计
userLevel menu
0 2人午晚餐 50 105 508 479 207 1349.0
4人午/晚自助 60 28 72 20 79 259.0
6人午/晚自助 0 0 20 0 18 38.0
单人下午自助烤肉 0 20 101 40 20 181.0
单人午/晚自助 0 0 10 0 0 10.0
单人午晚餐 40 30 289 185 145 689.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 3 25 18 46.0
周一至周五自助烤肉,免费WiFi 0 0 0 0 10 10.0
学生专享午晚自助 37 40 134 105 189 505.0
1 2人午晚餐 19 48 232 282 237 818.0
4人午/晚自助 0 0 0 0 0 NaN
6人午/晚自助 0 0 0 0 0 NaN
单人下午自助烤肉 78 0 0 20 0 98.0
单人午/晚自助 0 0 0 0 0 NaN
单人午晚餐 0 40 96 81 129 346.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 0 0 NaN
周一至周五自助烤肉,免费WiFi 0 0 0 0 12 12.0
学生专享午晚自助 42 0 77 49 0 168.0
2 2人午晚餐 100 157 350 678 441 1726.0
4人午/晚自助 57 0 133 146 95 431.0
6人午/晚自助 0 0 35 27 38 100.0
单人下午自助烤肉 0 0 65 16 108 189.0
单人午/晚自助 0 0 0 17 0 17.0
单人午晚餐 0 80 289 263 200 832.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 10 28 0 15 53.0
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 NaN
学生专享午晚自助 7 40 134 209 269 659.0
3 2人午晚餐 100 143 620 694 725 2282.0
4人午/晚自助 14 20 138 137 205 514.0
6人午/晚自助 8 0 38 39 98 183.0
... ... ... ... ... ... ...
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 NaN
学生专享午晚自助 15 91 144 346 210 806.0
4 2人午晚餐 60 80 204 481 351 1176.0
4人午/晚自助 0 20 58 98 90 266.0
6人午/晚自助 0 0 19 37 56 112.0
单人下午自助烤肉 0 0 40 8 20 68.0
单人午/晚自助 0 0 0 0 20 20.0
单人午晚餐 20 107 228 157 108 620.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 41 12 53.0
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 NaN
学生专享午晚自助 0 0 20 174 136 330.0
5 2人午晚餐 0 0 68 78 67 213.0
4人午/晚自助 0 0 31 0 47 78.0
6人午/晚自助 0 0 0 39 15 54.0
单人下午自助烤肉 0 0 0 0 0 NaN
单人午/晚自助 0 0 0 0 0 NaN
单人午晚餐 10 1 46 72 127 256.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 0 14 14.0
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 NaN
学生专享午晚自助 0 20 20 71 40 151.0
6 2人午晚餐 0 0 20 12 44 76.0
4人午/晚自助 0 0 0 13 20 33.0
6人午/晚自助 0 0 0 0 20 20.0
单人下午自助烤肉 0 0 0 0 0 NaN
单人午/晚自助 0 0 0 0 0 NaN
单人午晚餐 0 0 0 0 27 27.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 0 0 0 0 0 NaN
周一至周五自助烤肉,免费WiFi 0 0 0 0 0 NaN
学生专享午晚自助 0 0 0 0 19 19.0
总计 773 1120 4554 5659 5117 17223.0

64 rows × 6 columns

aggfunc传入字典,规定单个字段对应的聚合函数

df['star']=df['star'].astype("int")
pd.pivot_table(df,index=['menu'],columns=["userLevel"],values=["readCnt",'star'],
               aggfunc={"star":len,"readCnt":[np.sum]},fill_value=0)
#  可以aggfunc函数传入一个字典,规定单个字段对应的聚合函数
readCnt star
sum len
userLevel 0 1 2 3 4 5 6 0 1 2 3 4 5 6
menu
2人午晚餐 2505970 1186921 2154152 2590464 3620035 32495 77244 1349 818 1726 2282 1176 213 76
4人午/晚自助 1147597 0 357657 424148 172507 19899 58103 259 0 431 514 266 78 33
6人午/晚自助 15360 0 41372 238256 109480 33263 68880 38 0 100 183 112 54 20
单人下午自助烤肉 993593 224996 740385 352774 66663 0 0 181 98 189 103 68 0 0
单人午/晚自助 24240 0 40681 13280 30220 0 0 10 0 17 20 20 0 0
单人午晚餐 821464 841064 660942 3458140 569013 435266 8639 689 346 832 1150 620 256 27
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 3938 0 16661 2913 4355 951 0 46 0 53 43 53 14 0
周一至周五自助烤肉,免费WiFi 420 1212 0 0 0 0 0 10 12 0 0 0 0 0
学生专享午晚自助 393106 272327 1283419 706318 1118248 56191 131575 505 168 659 806 330 151 19

可以使用query 进行查询数据


table=pd.pivot_table(df,index=['menu'],columns=["userLevel"],values=["readCnt",'star'],
               aggfunc={"star":len,"readCnt":[np.sum]})
table
readCnt star
sum len
userLevel 0 1 2 3 4 5 6 0 1 2 3 4 5 6
menu
2人午晚餐 2505970.0 1186921.0 2154152.0 2590464.0 3620035.0 32495.0 77244.0 1349.0 818.0 1726.0 2282.0 1176.0 213.0 76.0
4人午/晚自助 1147597.0 NaN 357657.0 424148.0 172507.0 19899.0 58103.0 259.0 NaN 431.0 514.0 266.0 78.0 33.0
6人午/晚自助 15360.0 NaN 41372.0 238256.0 109480.0 33263.0 68880.0 38.0 NaN 100.0 183.0 112.0 54.0 20.0
单人下午自助烤肉 993593.0 224996.0 740385.0 352774.0 66663.0 NaN NaN 181.0 98.0 189.0 103.0 68.0 NaN NaN
单人午/晚自助 24240.0 NaN 40681.0 13280.0 30220.0 NaN NaN 10.0 NaN 17.0 20.0 20.0 NaN NaN
单人午晚餐 821464.0 841064.0 660942.0 3458140.0 569013.0 435266.0 8639.0 689.0 346.0 832.0 1150.0 620.0 256.0 27.0
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 3938.0 NaN 16661.0 2913.0 4355.0 951.0 NaN 46.0 NaN 53.0 43.0 53.0 14.0 NaN
周一至周五自助烤肉,免费WiFi 420.0 1212.0 NaN NaN NaN NaN NaN 10.0 12.0 NaN NaN NaN NaN NaN
学生专享午晚自助 393106.0 272327.0 1283419.0 706318.0 1118248.0 56191.0 131575.0 505.0 168.0 659.0 806.0 330.0 151.0 19.0

高级的透视表查询语句

table.query("menu==['2人午晚餐','单人午晚餐']")
readCnt star
sum len
userLevel 0 1 2 3 4 5 6 0 1 2 3 4 5 6
menu
2人午晚餐 2505970.0 1186921.0 2154152.0 2590464.0 3620035.0 32495.0 77244.0 1349.0 818.0 1726.0 2282.0 1176.0 213.0 76.0
单人午晚餐 821464.0 841064.0 660942.0 3458140.0 569013.0 435266.0 8639.0 689.0 346.0 832.0 1150.0 620.0 256.0 27.0

至此,pandas中的透视表的功能实例实现完成

posted on 2018-08-20 23:51 多一点 阅读(...) 评论(...) 编辑 收藏

你可能感兴趣的:(pandas)