pandas pivot_table 活学活用实例教程

时间:2022-05-02 00:47:55

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

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

  1. JVM活学活用——调优工具

    概述 工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相 ...

  2. HTML5--details活学活用

    这是补充HTML5基础知识的系列内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四. ...

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

    HTTP使用BASIC认证,WebAPI使用[HTTPBasicAuthorize]标记控制器就是使用了BASIC认证. BASIC认证的缺点HTTP基本认证的目标是提供简单的用户验证功能,其认证过程 ...

  4. JVM活学活用——GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...

  5. JVM活学活用——类加载机制

    类的实例化过程 有父类的情况 1. 加载父类静态    1.1 为静态属性分配存储空间并赋初始值     1.2 执行静态初始化块和静态初始化语句(从上至下) 2. 加载子类静态    2.1 为静态 ...

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

    Java内存结构: JVM内存结构主要是有三大块:堆内存.方法区和栈.堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分为三部分,Eden空间.From Survivor空间.To S ...

  7. JVM活学活用——优化springboot

    介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 1. 方便微服务部署. 2. 方便项目启动,不需要下载Tomcat或者 ...

  8. 活学活用wxPython基础框架

    看活活用wxpython这本书,基本框架是这样子的,这里有定义输出,然后打印出整个流程,可以看到是怎样执行的,明天请假了,五一回去玩几天,哈哈,估计假期过来都忘了 import wx import s ...

  9. 活学活用,CSS清除浮动的4种方法

    清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近. CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受. 1.结尾处加空div标签 ...

随机推荐

  1. POJ 1125 Stockbroker Grapevine

    Stockbroker Grapevine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33141   Accepted: ...

  2. 自己编写的sublime text 3 插件

    一些小功能,比较杂. 具体的功能在这里查看 1.本地环境的php运行结果获取. 2.快捷打开常用的文件,文件夹,url.(ctrl+shift+a) 3.常用的缩进转换. 下边是网络爬虫代码. #py ...

  3. 使Asp&period;net WebApi支持JSONP和Cors跨域访问

    1.服务端处理 同源策略(Same Origin Policy)的存在导致了“源”自A的脚本只能操作“同源”页面的DOM,“跨源”操作来源于B的页面将会被拒绝.同源策略以及跨域资源共享在大部分情况下针 ...

  4. Oracle检查锁及其等待的行ROWID

    SELECT l.session_id sid ,        substr(o.owner,               1,               8) owner,        o.o ...

  5. Git commit message和工作流规范

    目的 统一团队Git commit日志标准,便于后续代码review,版本发布以及日志自动化生成等等. 统一团队的Git工作流,包括分支使用.tag规范.issue等 Git commit日志参考案例 ...

  6. 【LeetCode】49&period; Group Anagrams

    题目: Given an array of strings, group anagrams together. For example, given: ["eat", " ...

  7. Effective Java 第三版——40&period; 始终使用Override注解

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. Redis事务和实现秒杀功能的实现

    今天带着学生学习了Redis的事务功能,Redis的事务与传统的关系型数据库(如MySQL)有所不同,Redis的事务不能回滚. Redis中使用multi.exec.discard.watch.un ...

  9. 两个队列实现栈&amp&semi;两个栈实现队列(JAVA)

    1,两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:栈的特点时先进后出,队列的特点是先进先出. 若此时有两个队列stack1,st ...

  10. CEdit编辑框字体和背景设置

    CEdit编辑框字体和背景设置注意事项:当CEdit为“disable”时,设置编辑框的字体和背景会没有效果.解决方案:将CEdit的Style设置为“readonly”,这样设置就能生效了,同时也能 ...