You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多国家数据集按国计算首年至最新年数值涨幅的代码问题

解决多国家数据集的年份涨幅计算问题

报错原因分析

你写的代码里,df["Year"].min()返回的是整个数据集的最小年份(单个数值),用df.loc[df["Year"].min(), "Value"]得到的是该年份对应的单个Value值(numpy.float64类型),而iloc[0]是Series或DataFrame专属方法,单个数值没有这个属性,所以触发AttributeError。另外,原代码未按Country分组,计算的是全局最小/最大年份数据,无法实现每个国家单独计算的需求。

方案一:使用groupby+agg聚合(推荐)

利用pandas分组聚合功能,按Country分组后提取每个国家最早、最新年份的Value,再计算涨幅:

import pandas as pd

# 假设原始数据集为df
# 1. 按国家分组,提取每组的关键数据
result = df.groupby("Country").apply(
    lambda x: pd.Series({
        "First_Year": x["Year"].min(),
        "First_Value": x.loc[x["Year"] == x["Year"].min(), "Value"].iloc[0],
        "Last_Year": x["Year"].max(),
        "Last_Value": x.loc[x["Year"] == x["Year"].max(), "Value"].iloc[0]
    })
).reset_index()

# 2. 计算涨幅百分比
result["% Increase"] = ((result["Last_Value"] - result["First_Value"]) / result["First_Value"]) * 100

如果每个国家在对应年份只有一条数据(无重复年份),可以简化为更高效的写法:

# 先按国家和年份排序,确保每组年份顺序正确
df_sorted = df.sort_values(["Country", "Year"])

# 分组后直接取每组首尾数据
result = df_sorted.groupby("Country").agg(
    First_Year=("Year", "first"),
    First_Value=("Value", "first"),
    Last_Year=("Year", "last"),
    Last_Value=("Value", "last")
).reset_index()

# 计算涨幅
result["% Increase"] = ((result["Last_Value"] - result["First_Value"]) / result["First_Value"]) * 100

方案二:自定义函数实现

如果需要更灵活的逻辑,可以自定义函数处理每个分组:

def calculate_growth(group):
    # 获取当前国家的最小、最大年份
    min_year = group["Year"].min()
    max_year = group["Year"].max()
    # 提取对应年份的Value
    first_val = group[group["Year"] == min_year]["Value"].iloc[0]
    last_val = group[group["Year"] == max_year]["Value"].iloc[0]
    # 计算涨幅
    growth = ((last_val - first_val) / first_val) * 100
    # 返回结果
    return pd.Series({
        "First_Year": min_year,
        "First_Value": first_val,
        "Last_Year": max_year,
        "Last_Value": last_val,
        "% Increase": growth
    })

# 应用函数到每个国家分组
result = df.groupby("Country").apply(calculate_growth).reset_index()

注意事项

  • 如果某个国家存在同一年份多条Value数据,需要先确定取值规则(比如均值、总和),可将iloc[0]替换为mean()或sum()。
  • 若First_Value为0,计算涨幅会触发除以0错误,需提前处理:
    result["% Increase"] = result.apply(
        lambda row: ((row["Last_Value"] - row["First_Value"]) / row["First_Value"]) * 100 if row["First_Value"] != 0 else float("nan"),
        axis=1
    )
    

内容的提问来源于stack exchange,提问作者Niamh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:01:07