zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Object类的方法简记
    run()和start()调用问题简记
    面向对象设计
    关于JVM的简记
    操作运算符的简记
    jdbc简记
    synchronized的简记
    垃圾回收的一些简记
    java.io.IOException: Stream closed
    Java-文件名、目录名或卷标语法不正确
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12844818.html
Copyright © 2011-2022 走看看