按地区和国家分组计算2016-2019年Yearly_rank的差值
问题需求
现有包含Region、Country、Year、Yearly_rank列的DataFrame,需按Region和Country分组,计算每个国家2016年至2019年之间Yearly_rank的变化值。
示例DataFrame代码
import pandas as pd df = pd.DataFrame([ {'Region': 'west europe', 'Country': 'Finland', 'Year': 2019, 'Yearly_rank': 1}, {'Region': 'west europe', 'Country': 'Denmark', 'Year': 2019, 'Yearly_rank': 2}, {'Region': 'west europe', 'Country': 'Norway', 'Year': 2019, 'Yearly_rank': 3}, {'Region': 'west europe', 'Country': 'Iceland', 'Year': 2019, 'Yearly_rank': 4}, {'Region': 'west europe','Country': 'Netherlands', 'Year': 2019, 'Yearly_rank': 5}, {'Region': 'west europe', 'Country': 'Switzerland', 'Year': 2019, 'Yearly_rank': 6}, {'Region': 'west europe', 'Country': 'Sweden','Year': 2019, 'Yearly_rank': 7}, {'Region': 'australia and new zealand', 'Country': 'New Zealand', 'Year': 2019, 'Yearly_rank': 8}, {'Region': 'north america', 'Country': 'Canada','Year': 2019, 'Yearly_rank': 9}, {'Region': 'west europe', 'Country': 'Austria', 'Year': 2019,'Yearly_rank': 10} ])
注:示例仅包含2019年数据,测试计算逻辑需补充对应国家2016年的
Yearly_rank记录。
解决方案
步骤1:筛选目标年份数据
先过滤出2016-2019年的记录,聚焦处理目标时间段的数据:
filtered_df = df[(df['Year'] >= 2016) & (df['Year'] <= 2019)]
步骤2:计算排名变化值
这里提供两种可靠的计算方式:
方式一:分组后直接提取年份值计算
通过分组后,获取每个国家2019年和2016年的排名并计算差值:
rank_change = filtered_df.groupby(['Region', 'Country']).apply( lambda x: x.loc[x['Year'] == 2019, 'Yearly_rank'].values[0] - x.loc[x['Year'] == 2016, 'Yearly_rank'].values[0] ).reset_index(name='Rank_Change_2016_2019')
注意:若某国家缺失2016或2019年数据,此方法会报错,适合数据完整的场景。
方式二:透视表计算(更稳健)
先将数据转为透视表,再计算差值,自动处理缺失数据(缺失时显示NaN):
# 生成透视表,行维度为Region+Country,列维度为Year,值为Yearly_rank pivot_df = filtered_df.pivot_table(index=['Region', 'Country'], columns='Year', values='Yearly_rank') # 计算2019-2016年的排名变化 pivot_df['Rank_Change_2016_2019'] = pivot_df[2019] - pivot_df[2016] # 重置索引得到结构化结果 result_df = pivot_df.reset_index()
结果说明
Rank_Change_2016_2019为正值:表示该国家2019年排名比2016年下降(比如从第2名掉到第5名,差值为3)Rank_Change_2016_2019为负值:表示该国家2019年排名比2016年上升(比如从第5名升到第2名,差值为-3)- 若出现
NaN,说明对应国家缺失2016或2019年的排名数据,可根据需求用fillna()填充处理。
内容的提问来源于stack exchange,提问作者Amir Katorza
相关产品推荐
相关产品推荐

