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行

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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()

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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()
<class ‘pandas.core.frame.DataFrame‘>
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‘])

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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
<function pandas.core.reshape.pivot.pivot_table(data, values=None, index=None, columns=None, aggfunc=‘mean‘, fill_value=None, margins=False, dropna=True, margins_name=‘All‘)>

多个索引列

# 实际上单个索引的pivot_table 与groupby得到的结果一样,可以这样说,pivot_table是高级版本的groupby,提供了很多groupby不能实现的功能
# 多索引,通过列表传入
pd.pivot_table(df,index=[‘menu‘,‘star‘])
# 发现一个问题,star索引列中的数据显示不全,有的menu评分不全,不过这并不影响我们进行分析
# 加入star列类型是int类型的话,会有显示不全的信息,但是将star列转化为category类之后,数据显示完整,后文有示例
# 发现每个menu重的点赞的平均数在评分位10分的最高,也就是浏览评论数据的人中给10分的评价点赞数最多,很可能是因为一针见血的指出了该品类的真相。。

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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‘)

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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)

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead th { text-align: right }

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])

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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])

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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])

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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])

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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)

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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=‘总计‘)
# 显示总计

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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函数传入一个字典,规定单个字段对应的聚合函数

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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人午晚餐‘,‘单人午晚餐‘]")

.dataframe tbody tr th:only-of-type { vertical-align: middle }
.dataframe tbody tr th { vertical-align: top }
.dataframe thead tr th { text-align: left }
.dataframe thead tr:last-of-type th { text-align: right }

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中的透视表的功能实例实现完成

原文地址:https://www.cnblogs.com/onemorepoint/p/9508910.html

时间: 2024-08-25 13:40:24

pandas pivot_table 活学活用实例教程的相关文章

开机动画 看图学Android---Android 开发实例教程五

Android实例图解教程目录 http://blog.csdn.net/wyx100/article/details/45061407 在<开发一个新的android界面.界面跳转 看图学Android---Android 开发实例教程三.四>基础完成开机动画,开机界面的图片,在5.5秒内逐渐消失,显示主界面. 只修改StartActivity.java中代码以下部分 StartActivity.java源代码 package com.example.helloword; import an

活学活用,webapi HTTPBasicAuthorize搭建小型云应用的实践

HTTP使用BASIC认证,WebAPI使用[HTTPBasicAuthorize]标记控制器就是使用了BASIC认证. BASIC认证的缺点HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的 系统或设备中,如大家所用路由器的配置页面的认证,几乎 都采取了这种方式.其缺点是没有灵活可靠的认证策略,如 无法提供域(domain或realm)认证功能,另外,BASE64的加密强度非常低,可以说仅 能防止sohu的搜索把它搜到了. 当然,HTTP基本认证系统也

开发一个新的android界面、界面跳转 看图学Android---Android 开发实例教程三、四

Android实例图解教程目录 http://blog.csdn.net/wyx100/article/details/45061407 一.课程功能 本课程讲述建立一个新界面和界面切换(从界面一切换到界面二). 二.课程界面 界面一(启动界面) 界面二(主界面) 三.工作流程 完成页面切换需要2个过程: 1.建立一个工程,见第二节. http://blog.csdn.net/wyx100/article/details/45248209 可以在该项目基础继续开发. 2.建立开机界面 先引入资源

JVM活学活用——Jvm内存结构

Java内存结构: JVM内存结构主要是有三大块:堆内存.方法区和栈.堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分为三部分,Eden空间.From Survivor空间.To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配: 方法区存储类信息.常量.静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆): 栈又分为Java虚拟机栈和本地方法栈,主要用于方法的执行. 在通过一张图来了解如何通过参数来控制各区域的内存大

活学活用wxPython基础框架

看活活用wxpython这本书,基本框架是这样子的,这里有定义输出,然后打印出整个流程,可以看到是怎样执行的,明天请假了,五一回去玩几天,哈哈,估计假期过来都忘了 import wx import sys class Frame(wx.Frame): def __init__(self,parent,id,title): print "Frame __init__" wx.Frame.__init__(self,parent,id,title) class App(wx.App): d

一步一步图示开发第一个Android项目并运行 看图学Android---Android 开发实例教程二

一.生成一个Android应用工程 1.运行eclipse.exe 2.见下图 3.进入界面 4.输入 应用.项目.包名称 5.选择 项目建立的工作空间路径: 6.配置 图标和背景等特性 7.选择 Activity  的页面格式 8.设置对应名称 9.生成项目 二. 项目介绍 1.界面 可以使用工具采用拖拉的方式 拖动控件.  图形界面开发环境. 2.界面布局的代码格式 3.MainActivity.java  主程序结构   代码和视图绑定 3.代码MainActivity.java pack

LINQ to SQL活学活用(4):监视你的一举一动

改进 这也可以运用GoF23中的观察者模式,让多个观察者对象(对象创建.修改)同时监听某一个主题对象(这里就是数据访问对象Customer).这个主题对象Customer在状态发生变化时,会通知所有观察者对象(对象创建.修改),使它们能够自动更新自己,就可以实现监视Customer的一举一动了. 我们来实现这个功能,先看看这篇完成的整体架构. 数据访问层 1.数据访问基类 我们为整个数据访问对象定义一个公共基类,首先定义定义数据访问基类接口,让抽象数据访问基类实现这个接口,这个基类用于存放数据访

LINQ to SQL活学活用(3):嗅出“臭味”烟消云散

改进 知道程序的"臭味",我们如何改进呢?想想,通过接口隐藏实体.我们利用接口实现,为Customer创建分部类,创建ICustomer接口,Customer实现ICustomer接口,利用ICustomer接口编写CustomerFacade,根据新的ICustomer接口更新单元测试,而不是上一节的对Customer对象做单元测试,这样客户就不知道数据访问层中具体实现了.这就是我们这一节做的工作. 数据访问层 进一步改进我们的程序,看看数据访问层的类图设计: 1.新建ICustom

LINQ to SQL活学活用(2):躲起来别让我看见

改进 这可以考虑到GoF23中的外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 考虑在数据访问层中建立外观Facade,这样可以为复杂的数据访问方法提供一个简单的类,使得耦合大大降低.增加外观Facade可以只向客户提供一个简单的接口,减少客户与数据访问层之间的依赖,更容易维护和扩展了. 数据访问层 我们就使用这种方法来改进第一篇的程序吧.首先创建一个基类用于存放公共的方法,然后各个数据访问对象(这里只有Custo