持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
总计:今天是十月更文计划第八天,第十二篇
今天继续对pands进行实战:
使用分组与聚合对员工业绩进行汇总: groupby方法
groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
参数by用来指定作用于index的函数、字典、Series对象,或者指定列名作为分组依据;
参数as_index=False时,用来分组的列中的数据不作为结果DataFrame对象的index;
参数squeeze=True时会在可能的情况下降低结果对象的维度。
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)
# 读取全部数据,使用默认索引(默认从0开始索引)
df = pd.read_excel(r'超市营业额2.xlsx')
print('根据lambda表达式对index处理后的结果分组'.ljust(30,'='))
print(df.groupby(by=lambda num: num%5)['交易额'].sum()) #用索引对5的余数进行分组,余数为0的1组,为1的为一组等等...
输出的结果如下:
# 根据指定字典的“键”对index进行分组,“值”作为index标签
print('指定by参数为字典'.ljust(30,'='))
print(df.groupby(by={7:'下标为7的行', 35:'下标为35的行'})['交易额'].sum())
print('不同时段的销售总额'.ljust(30,'='))
print(df.groupby(by='时段')['交易额'].sum())
print('各柜台的销售总额'.ljust(30,'='))
print(df.groupby(by='柜台')['交易额'].sum())
输出的结果如下:
可以查看每个员工上班总时长是否均匀
print('每个员工上班的次数'.ljust(30,'='))
dff = df.groupby(by='姓名')['日期'].count()
dff.name = '上班次数'
print(dff)
print('每个员工交易额平均值'.ljust(30,'=')) #交易额的平均值,保留2位小数,再排序
print(df.groupby(by='姓名')[ '交易额'].mean().round(2).sort_values())
print('汇总交易额转换为整数'.ljust(30,'='))
print(df.groupby(by='姓名').sum()['交易额'].apply(int)) #,交易额单独拿出来求和,apply函数将“求整”应用到前面的数据
输出的结果如下:
print('每个员工交易额的中值'.ljust(30,'='))
dff = df.groupby(by='姓名').median() #按照姓名分组,然后对其他列的数据求中值
print(dff['交易额']) #查看每个员工交易额
dff['排名'] = dff['交易额'].rank(ascending=False) #给dataFrame结构增加一个“排名”列,按照rank函数排序,“降序”排列
print('每个员工交易额中值的排名'.ljust(30,'='))
print(dff[['交易额','排名']])
输出的结果如下: