如何使用groupby函数按年份与国家聚合变量并分析国家层面年度均值变化?
没问题!要查看sfd_indx在国家层面的年度均值变化趋势,咱们可以用pandas做数据聚合,再用可视化工具画出清晰的趋势图,下面是具体的步骤和代码示例,直接就能套用:
第一步:数据预处理与年度均值聚合
首先得确保你的数据框outcome_v里有国家标识列(比如命名为country)和年份列(比如year),然后按这两列分组,计算每个国家每年的sfd_indx均值:
import pandas as pd # 按国家+年份分组,计算sfd_indx的年度均值,转成新的数据框 country_year_mean = outcome_v.groupby(['country', 'year'])['sfd_indx'].mean().reset_index()
运行完这行代码,你就得到了每个国家每年的sfd_indx平均水平数据,接下来就可以可视化了。
第二步:可视化趋势(三种常用场景)
根据你数据里的国家数量,选对应的可视化方式:
场景1:国家数量少,同图对比所有趋势
如果你的国家不多,把所有国家的趋势线放在一张图里对比会很直观,用seaborn的lineplot就能快速实现:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) # 画折线图,按国家区分颜色 sns.lineplot(data=country_year_mean, x='year', y='sfd_indx', hue='country') plt.title('Annual Mean of sfd_indx by Country') plt.xlabel('Year') plt.ylabel('Mean sfd_indx') # 把图例移到图外,避免遮挡趋势线 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.show()
场景2:国家数量多,分面展示单个国家趋势
要是国家数量比较多,同一张图挤在一起根本看不清,这时候用分面图把每个国家的趋势单独展示就很合适:
# 创建分面网格,每4个国家一行 g = sns.FacetGrid(country_year_mean, col='country', col_wrap=4, height=3, sharex=True, sharey=False) # 给每个子图画折线 g.map(sns.lineplot, 'year', 'sfd_indx') # 设置坐标轴标签和子图标题 g.set_axis_labels('Year', 'Mean sfd_indx') g.set_titles(col_template='{col_name}') plt.tight_layout() plt.show()
场景3:只关注特定国家的趋势
如果只关心几个重点国家的变化,先筛选出目标国家的数据再画图就行:
# 替换成你实际要关注的国家名称 target_countries = ['Country A', 'Country B', 'Country C'] filtered_data = country_year_mean[country_year_mean['country'].isin(target_countries)] plt.figure(figsize=(10, 6)) # 加上标记点,让趋势变化更明显 sns.lineplot(data=filtered_data, x='year', y='sfd_indx', hue='country', marker='o') plt.title('Annual Mean of sfd_indx for Target Countries') plt.xlabel('Year') plt.ylabel('Mean sfd_indx') plt.show()
额外小提示
- 如果数据里有缺失值,可以先清理一下:
outcome_v = outcome_v.dropna(subset=['sfd_indx', 'country', 'year']),避免聚合时出错 - 如果年份列是字符串类型,记得转成数值型:
outcome_v['year'] = pd.to_numeric(outcome_v['year']),不然画图时年份顺序会乱
内容的提问来源于stack exchange,提问作者Korkut
相关产品推荐
相关产品推荐

