透视表与交叉表

透视表(pivot table)数据汇总分析工具。
根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。
1、在Python和pandas中,通过groupby功能以及重塑运算制作透视表
2、DataFrame有一个pivot_table 方法
3、顶级的pandas.pivot_table函数
pivot_table 可以添加分项小计
 
小费数据集,根据sex和smoker计算分组平均值,并将sex和smoker放到行上
1 #书中是rows,但是没办法运行
2 tips.pivot_table(index=['sex','smoker'])
3 Out[42]: 
4                    size       tip   tip_pct  total_bill
5 sex    smoker                                          
6 Female No      2.592593  2.773519  0.156921   18.105185
7        Yes     2.242424  2.931515  0.182150   17.977879
8 Male   No      2.711340  3.113402  0.160669   19.791237
9        Yes     2.500000  3.051167  0.152771   22.284500

只聚合tip_pct和size,根据day分组,smoker在列上,day 在行上:

 1 tips.pivot_table(['tip_pct','size'],index=['sex','day'],columns='smoker')
 2 Out[43]: 
 3                  size             tip_pct          
 4 smoker             No       Yes        No       Yes
 5 sex    day                                         
 6 Female Fri   2.500000  2.000000  0.165296  0.209129
 7        Sat   2.307692  2.200000  0.147993  0.163817
 8        Sun   3.071429  2.500000  0.165710  0.237075
 9        Thur  2.480000  2.428571  0.155971  0.163073
10 Male   Fri   2.000000  2.125000  0.138005  0.144730
11        Sat   2.656250  2.629630  0.162132  0.139067
12        Sun   2.883721  2.600000  0.158291  0.173964
13        Thur  2.500000  2.300000  0.165706  0.164417

传入margins=True添加分项小计

 1 tips.pivot_table(['tip_pct','size'],index=['sex','day'],
 2 columns='smoker',margins=True)
 3 Out[44]: 
 4                  size                       tip_pct                    
 5 smoker             No       Yes       All        No       Yes       All
 6 sex    day                                                             
 7 Female Fri   2.500000  2.000000  2.111111  0.165296  0.209129  0.199388
 8        Sat   2.307692  2.200000  2.250000  0.147993  0.163817  0.156470
 9        Sun   3.071429  2.500000  2.944444  0.165710  0.237075  0.181569
10        Thur  2.480000  2.428571  2.468750  0.155971  0.163073  0.157525
11 Male   Fri   2.000000  2.125000  2.100000  0.138005  0.144730  0.143385
12        Sat   2.656250  2.629630  2.644068  0.162132  0.139067  0.151577
13        Sun   2.883721  2.600000  2.810345  0.158291  0.173964  0.162344
14        Thur  2.500000  2.300000  2.433333  0.165706  0.164417  0.165276
15 All          2.668874  2.408602  2.569672  0.159328  0.163196  0.160803

想使用其他聚合函数,将其传给aggfunc

tips.pivot_table('tip_pct',index=['sex','smoker'],columns='day',
aggfunc=len,margins=True)
Out[45]: 
day             Fri   Sat   Sun  Thur    All
sex    smoker                               
Female No       2.0  13.0  14.0  25.0   54.0
       Yes      7.0  15.0   4.0   7.0   33.0
Male   No       2.0  32.0  43.0  20.0   97.0
       Yes      8.0  27.0  15.0  10.0   60.0
All            19.0  87.0  76.0  62.0  244.0

存在NA值,设置一个fill_value:

 1 tips.pivot_table('size',index=['time','sex','smoker'],columns='day',aggfunc='sum',fill_value=0)
 2 Out[46]: 
 3 day                   Fri  Sat  Sun  Thur
 4 time   sex    smoker                     
 5 Dinner Female No        2   30   43     2
 6               Yes       8   33   10     0
 7        Male   No        4   85  124     0
 8               Yes      12   71   39     0
 9 Lunch  Female No        3    0    0    60
10               Yes       6    0    0    17
11        Male   No        0    0    0    50
12               Yes       5    0    0    23

     pivot_table参数:

               

values:待聚合的列的名称,默认聚合所有的数值列。
index:用于分组的列名或其他分组键,出现在结果透视表的行
columns:用于分组的列名或其他分组键,出现在结果透视表的列
aggfunc:聚合函数或函数列表,默认为'mean'。
fill_value:用于替换结果表中的缺失值
margins:添加行/列小计和总计,默认为False
 
 
交叉表
交叉表(crosstab)是一种用于计算分组频率的特殊透视表。
 1 #书中没有这个data数据,自己创建一个
 2 data=pd.read_excel(r'C:\Users\Administrator\Desktop\data.xlsx')
 3 
 4 data
 5 Out[50]: 
 6    Sample  Gender    Handedness
 7 0       1  Female  Right-handed
 8 1       2    Male   Left-handed
 9 2       3  Female  Right-handed
10 3       4    Male  Right-handed
11 4       5    Male   Left-handed
12 5       6    Male  Right-handed
13 6       7  Female  Right-handed
14 7       8  Female   Left-handed
15 8       9    Male  Right-handed
16 9      10  Female  Right-handed
17 #使用pandas.crosstab
18 pd.crosstab(data.Gender,data.Handedness,margins=True)
19 Out[51]: 
20 Handedness  Left-handed  Right-handed  All
21 Gender                                    
22 Female                1             4    5
23 Male                  2             3    5
24 All                   3             7   10
25 
26 #crosstab的前2个参数可以是数组、Series或数组列表
27 pd.crosstab([tips.time,tips.day],tips.smoker,margins=True)
28 Out[52]: 
29 smoker        No  Yes  All
30 time   day                
31 Dinner Fri     3    9   12
32        Sat    45   42   87
33        Sun    57   19   76
34        Thur    1    0    1
35 Lunch  Fri     1    6    7
36        Thur   44   17   61
37 All          151   93  244

crosstab函数的参数:

posted @ 2018-07-26 18:03  平淡才是真~~  阅读(3369)  评论(0编辑  收藏  举报