pandas_使用透视表与交叉表查看业绩汇总数据

# 使用透视表与交叉表查看业绩汇总数据
import pandas as pd
import numpy as np
import copy

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

dataframe = pd.read_excel(r'C:UserslenovoDesktop总结Python超市营业额.xlsx')

# 对姓名和日期进行分组,并进行求和
dff = dataframe.groupby(by = ['姓名','日期'],as_index = False).sum()
'''
    姓名      日期  工号  交易额
0   周七  20190301  1005     600
1   周七  20190302  1005     580
2   张三  20190301  1001    2000
3   张三  20190302  2002    1900
4   张三  20190303  1001    1300
5   李四  20190301  1002    1800
6   李四  20190302  2004    2180
7   王五  20190301  1003     800
8   王五  20190302  2006    1830
9   赵六  20190301  1004    1100
10  赵六  20190302  1004    1050
11  钱八  20190301  2012    1550
12  钱八  20190302  1006     720
'''
# 将 dff 的索引,列 设置成透视表形式
dff = dff.pivot(index = '姓名',columns = '日期',values = '交易额')
'''
日期  20190301  20190302  20190303
姓名                              
周七     600.0     580.0       NaN
张三    2000.0    1900.0    1300.0
李四    1800.0    2180.0       NaN
王五     800.0    1830.0       NaN
赵六    1100.0    1050.0       NaN
钱八    1550.0     720.0       NaN
'''
# 查看前一天的数据
dff.iloc[:,:1]
'''
日期  20190301
姓名          
周七     600.0
张三    2000.0
李四    1800.0
王五     800.0
赵六    1100.0
钱八    1550.0
'''
# 交易总额小于 4000 的人的前三天业绩
dff[dff.sum(axis = 1) < 4000].iloc[:,:3]
'''
日期  20190301  20190302  20190303
姓名                              
周七     600.0     580.0       NaN
李四    1800.0    2180.0       NaN
王五     800.0    1830.0       NaN
赵六    1100.0    1050.0       NaN
钱八    1550.0     720.0       NaN
'''
# 工资总额大于 2900 元的员工的姓名
dff[dff.sum(axis = 1) > 2900].index.values
# array(['张三', '李四'], dtype=object)

# 显示前两天每一天的交易总额以及每个人的交易金额
dataframe.pivot_table(values = '交易额',index = '姓名',
                      columns = '日期',aggfunc = 'sum',margins = True).iloc[:,:2]
'''
日期  20190301  20190302
姓名                    
周七     600.0     580.0
张三    2000.0    1900.0
李四    1800.0    2180.0
王五     800.0    1830.0
赵六    1100.0    1050.0
钱八    1550.0     720.0
All     7850.0    8260.0
'''
# 显示每个人在每个柜台的交易总额
dff = dataframe.groupby(by = ['姓名','柜台'],as_index = False).sum()
dff.pivot(index = '姓名',columns = '柜台',values = '交易额')
'''
柜台  化妆品  日用品  蔬菜水果    食品
姓名                                  
周七     NaN  1180.0       NaN     NaN
张三  4600.0     NaN     600.0     NaN
李四  3300.0     NaN     680.0     NaN
王五     NaN     NaN     830.0  1800.0
赵六     NaN     NaN       NaN  2150.0
钱八     NaN  1420.0     850.0     NaN
'''
# 查看每人每天的上班次数
dataframe.pivot_table(values = '交易额',index = '姓名',columns = '日期',aggfunc = 'count',margins = True).iloc[:,:1]
'''
日期  20190301
姓名          
周七       1.0
张三       1.0
李四       1.0
王五       1.0
赵六       1.0
钱八       2.0
All        7.0
'''
# 查看每个人每天购买的次数
dataframe.pivot_table(values = '交易额',index = '姓名',columns = '日期',aggfunc = 'count',margins = True)
'''
日期  20190301  20190302  20190303  All
姓名                                   
周七       1.0       1.0       NaN    2
张三       1.0       2.0       1.0    4
李四       1.0       2.0       NaN    3
王五       1.0       2.0       NaN    3
赵六       1.0       1.0       NaN    2
钱八       2.0       1.0       NaN    3
All        7.0       9.0       1.0   17
'''
# 交叉表
# 每个人每天上过几次班
pd.crosstab(dataframe.姓名,dataframe.日期,margins = True).iloc[:,:2]
'''
日期  20190301  20190302
姓名                    
周七         1         1
张三         1         2
李四         1         2
王五         1         2
赵六         1         1
钱八         2         1
All          7         9
'''
# 每个人每天去过几次柜台
pd.crosstab(dataframe.姓名,dataframe.柜台)
'''
柜台  化妆品  日用品  蔬菜水果  食品
姓名                                
周七       0       2         0     0
张三       3       0         1     0
李四       2       0         1     0
王五       0       0         1     2
赵六       0       0         0     2
钱八       0       2         1     0
'''
# 将每一个人在每一个柜台的交易总额显示出来
pd.crosstab(dataframe.姓名,dataframe.柜台,dataframe.交易额,aggfunc='sum')
'''
柜台  化妆品  日用品  蔬菜水果    食品
姓名                                  
周七     NaN  1180.0       NaN     NaN
张三  4600.0     NaN     600.0     NaN
李四  3300.0     NaN     680.0     NaN
王五     NaN     NaN     830.0  1800.0
赵六     NaN     NaN       NaN  2150.0
钱八     NaN  1420.0     850.0     NaN
'''
# 每个人在每个柜台交易额的平均值,金额/天数
pd.crosstab(dataframe.姓名,dataframe.柜台,dataframe.交易额,aggfunc = 'mean').apply(lambda  num:round(num,2) )
'''
柜台   化妆品  日用品  蔬菜水果    食品
姓名                                   
周七      NaN   590.0       NaN     NaN
张三  1533.33     NaN     600.0     NaN
李四  1650.00     NaN     680.0     NaN
王五      NaN     NaN     830.0   900.0
赵六      NaN     NaN       NaN  1075.0
钱八      NaN   710.0     850.0     NaN
'''

2020-05-07

原文地址:https://www.cnblogs.com/hany-postq473111315/p/12844818.html