如何在Pandas DataFrame中按双条件分组计算Profit_Or_Loss的YOY同比变化
问题原因
- 第一版代码分组粒度过细:
groupby(['Location','Year'])会将每个Location的每一年单独分为一组,每个分组仅包含1条数据,当前值除以自身自然得到全0结果。 - 第二版代码没有做分组限制:全局调用
pct_change()会跨Location计算,无法在Location变更时自动重置计算逻辑。
解决代码
# 导入pandas库 import pandas as pd # 初始化嵌套列表数据 data = [[110,2020,'CHASE CENTER',53901,8904,44997,4], [110,2019,'CHASE CENTER',57999,4921,53078,1], [110,2018,'CHASE CENTER',91015,9945,81070,1], [640,2020,'LAMBEAU WI',76214,5773,70441,3], [619,2020,'SAL AIRPORT',93000,8278,84722,5]] # 创建Pandas DataFrame df = pd.DataFrame(data, columns = ['Location', 'Year', 'Location_Description', 'Revenue', 'Spend', 'Profit_Or_Loss', 'cluster_number']) # 第一步:按Location升序、Year降序排序,保证同个地点的年份按从新到旧排列 df = df.sort_values(by=['Location', 'Year'], ascending=[True, False]) # 第二步:仅按Location分组,组内计算同比百分比变化 # periods=-1表示用当前行和下一行(即上一年的数据)做差值计算 df['YOY_Percent_Change'] = df.groupby('Location')['Profit_Or_Loss'].pct_change(periods=-1).mul(100).round(2) print(df)
结果说明
运行代码后,每个Location最早的年份(分组最后一行)因为没有上年数据,同比字段会显示为空值,其他年份会得到正确的同比百分比结果,符合预期要求。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

