使用Pandas的groupby或pivot找出2017-2018年销售冠军及对应水果类型
解决Pandas中找出两年销售额变化幅度最大的销售及对应水果问题
嘿,作为Pandas新手碰到这种跨年份对比的分组问题太正常啦!其实用你试过的groupby或者pivot就能轻松搞定,我给你一步步拆解开,保证好懂~
第一步:先明确数据结构(附示例数据)
首先假设你的销售数据大概是这样的(如果和你的实际结构有出入,调整列名就行):
import pandas as pd # 构造示例销售数据集 data = { '销售人员': ['张三', '李四', '王五', '张三', '李四', '王五', '赵六'], '水果类型': ['苹果', '香蕉', '橙子', '苹果', '香蕉', '橙子', '草莓'], '年份': [2017, 2017, 2017, 2018, 2018, 2018, 2017], # 赵六2018年没数据,模拟缺失情况 '销售额': [12000, 9000, 15000, 18000, 16000, 13000, 8000] } df = pd.DataFrame(data)
第二步:筛选目标年份+重塑数据
先把2017和2018年的数据筛出来,避免其他年份干扰,然后用pivot_table把年份转成列,这样就能直接对比两年的销售额:
# 筛选2017-2018年的数据 filtered_df = df[df['年份'].isin([2017, 2018])] # 用pivot_table重塑:以「销售人员+水果类型」为索引,年份为列,销售额为值 # 加fill_value=0是为了处理某年份缺失数据的情况(比如赵六2018年没销售) pivot_df = filtered_df.pivot_table( index=['销售人员', '水果类型'], columns='年份', values='销售额', aggfunc='sum', # 如果同个销售+水果+年份有多条记录,用sum合并 fill_value=0 )
第三步:计算销售额变化幅度
接下来计算两年的销售额变化值和变化幅度(增长率),这里分两种情况:
- 绝对值变化:直接用2018年销售额减2017年,适合看“卖多/卖少了多少钱”
- 相对变化幅度(增长率):适合看“销售额涨/跌了百分之多少”
# 计算绝对值变化 pivot_df['销售额变化值'] = pivot_df[2018] - pivot_df[2017] # 计算相对变化幅度(百分比),避免除以0的情况可以加个判断 pivot_df['销售额变化幅度(%)'] = pivot_df.apply( lambda row: (row[2018] - row[2017]) / row[2017] * 100 if row[2017] != 0 else 0, axis=1 )
第四步:找出变化幅度最大的记录
现在直接找变化幅度最大的那条就行,这里以绝对值变化最大为例(如果要找增长率最大,把abs().idxmax()里的列换成销售额变化幅度(%)就行):
# 找出销售额变化值绝对值最大的记录 max_change_record = pivot_df.loc[pivot_df['销售额变化值'].abs().idxmax()] print("两年间销售额变化幅度最大的记录:") print(max_change_record)
用groupby的替代方案
如果你更倾向用groupby,其实原理和pivot差不多,只是用unstack把年份转成列:
# groupby+unstack实现同样的重塑效果 grouped_df = filtered_df.groupby(['销售人员', '水果类型', '年份'])['销售额'].sum().unstack('年份', fill_value=0) # 后面计算变化幅度和找最大值的步骤和上面完全一致
小提醒
- 如果你的数据里有缺失值(比如某个销售某一年没有数据),一定要用
fill_value=0或者fillna(0)处理,不然计算变化值会得到NaN - 记得确认“变化幅度最大”是指绝对值变化还是相对增长率,根据需求调整对应的列就行
内容的提问来源于stack exchange,提问作者bronzing
相关产品推荐
相关产品推荐

