jzlixiao 2020-05-07
# 分组与聚合 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
计算的时候总共分3步,1到2是第二组......lower: i. 这组数据中的小值 higher: j. 这组数据中的大值,fraction 是第三步中的小数部分,意思是当前这组数据的0到1的分位数
Series是一种类似于一维数组的对象,由一组数据以及一组与之对应的索引组成。 index: 索引序列,必须是唯一的,且与数据的长度相同. 如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引