pandas_分类与聚合

# 分组与聚合
import pandas as pd
import numpy as np

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

# 读取工号姓名时段交易额,使用默认索引
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',
                          usecols = ['工号','姓名','时段','交易额','柜台'])

# 对 5 的余数进行分组
dataframe.groupby(by = lambda num:num % 5)['交易额'].sum()
'''
0    4530
1    5000
2    1980
3    3120
4    2780
Name: 交易额, dtype: int64
'''
# 查看索引为 7 15 的交易额
dataframe.groupby(by = {7:'索引为7的行',15:'索引为15的行'})['交易额'].sum()
'''
索引为15的行    830
索引为7的行     600
Name: 交易额, dtype: int64
'''
# 查看不同时段的交易总额
dataframe.groupby(by = '时段')['交易额'].sum()
'''
时段
14:00-21:00    8300
9:00-14:00     9110
Name: 交易额, dtype: int64
'''
# 各柜台的销售总额
dataframe.groupby(by = '柜台')['交易额'].sum()
'''
柜台
化妆品      7900
日用品      2600
蔬菜水果    2960
食品        3950
Name: 交易额, dtype: int64
'''
# 查看每个人在每个时段购买的次数
count = dataframe.groupby(by = '姓名')['时段'].count()
'''
姓名
周七    2
张三    4
李四    3
王五    3
赵六    2
钱八    3
Name: 时段, dtype: int64
'''
#
count.name = '交易人和次数'
'''

'''
# 每个人的交易额平均值并排序
dataframe.groupby(by = '姓名')['交易额'].mean().round(2).sort_values()
'''
姓名
周七     590.00
钱八     756.67
王五     876.67
赵六    1075.00
张三    1300.00
李四    1326.67
Name: 交易额, dtype: float64
'''

# 每个人的交易额,apply(int) 转换为整数
dataframe.groupby(by = '姓名').sum()['交易额'].apply(int)
'''
姓名
周七    1180
张三    5200
李四    3980
王五    2630
赵六    2150
钱八    2270
Name: 交易额, dtype: int64
'''
# 每一个员工交易额的中值
data = dataframe.groupby(by = '姓名').median()
'''
      工号  交易额
姓名              
周七  1005     590
张三  1001    1300
李四  1002    1500
王五  1003     830
赵六  1004    1075
钱八  1006     720
'''
data['交易额']
'''
姓名
周七     590
张三    1300
李四    1500
王五     830
赵六    1075
钱八     720
Name: 交易额, dtype: int64
'''
# 查看交易额对应的排名
data['排名'] = data['交易额'].rank(ascending = False)
data[['交易额','排名']]
'''
      交易额  排名
姓名              
周七     590   6.0
张三    1300   2.0
李四    1500   1.0
王五     830   4.0
赵六    1075   3.0
钱八     720   5.0
'''
# 每个人不同时段的交易额
dataframe.groupby(by = ['姓名','时段'])['交易额'].sum()
'''
姓名  时段       
周七  9:00-14:00     1180
张三  14:00-21:00     600
      9:00-14:00     4600
李四  14:00-21:00    3300
      9:00-14:00      680
王五  14:00-21:00     830
      9:00-14:00     1800
赵六  14:00-21:00    2150
钱八  14:00-21:00    1420
      9:00-14:00      850
Name: 交易额, dtype: int64
'''
# 设置各时段累计
dataframe.groupby(by = ['姓名'])['时段','交易额'].aggregate({'交易额':np.sum,'时段':lambda x:'各时段累计'})
'''
      交易额        时段
姓名                    
周七    1180  各时段累计
张三    5200  各时段累计
李四    3980  各时段累计
王五    2630  各时段累计
赵六    2150  各时段累计
钱八    2270  各时段累计
'''
# 对指定列进行聚合,查看最大,最小,和,平均值,中值
dataframe.groupby(by = '姓名').agg(['max','min','sum','mean','median'])
'''
      工号                          交易额                                
       max   min   sum  mean median    max   min   sum         mean median
姓名                                                                      
周七  1005  1005  2010  1005   1005    600   580  1180   590.000000    590
张三  1001  1001  4004  1001   1001   2000   600  5200  1300.000000   1300
李四  1002  1002  3006  1002   1002   1800   680  3980  1326.666667   1500
王五  1003  1003  3009  1003   1003   1000   800  2630   876.666667    830
赵六  1004  1004  2008  1004   1004   1100  1050  2150  1075.000000   1075
钱八  1006  1006  3018  1006   1006    850   700  2270   756.666667    720
'''
# 查看部分聚合后的结果
dataframe.groupby(by = '姓名').agg(['max','min','sum','mean','median'])['交易额']
'''
       max   min   sum         mean  median
姓名                                       
周七   600   580  1180   590.000000     590
张三  2000   600  5200  1300.000000    1300
李四  1800   680  3980  1326.666667    1500
王五  1000   800  2630   876.666667     830
赵六  1100  1050  2150  1075.000000    1075
钱八   850   700  2270   756.666667     720
'''

2020-05-07

posted @ 2020-05-07 18:41  CodeYaSuo  阅读(395)  评论(0编辑  收藏  举报