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

按ISO3分组统计各国每年设立的保护区数量,代码报错求助

解决按国家ISO3统计各年份保护区设立数量的问题

原代码的问题

  • len(group[columns])返回的是整数(该国家保护区总数量),不是可操作的Series/DataFrame,所以column["ISO3"] = key会直接报错——整数类型不支持这种赋值操作。
  • 逻辑完全偏离需求:代码只计算了每个国家的保护区总数,没有实现“按年份拆分统计数量”的核心目标。
  • 循环拼接DataFrame的方式效率极低,不符合pandas的最佳实践。

正确实现方法(推荐无循环方案)

假设你的原始数据集是包含ISO3和STATUS_YR列的DataFrame(命名为df),直接用pandas内置的分组聚合功能即可完成需求,无需手动循环:

方法1:groupby + unstack

# 按国家+年份分组统计数量,将年份转为列,无数据的年份填充0
protected_areas = df.groupby(['ISO3', 'STATUS_YR']).size().unstack(fill_value=0)
# 将ISO3从索引转为普通列
protected_areas = protected_areas.reset_index()

方法2:pivot_table(透视表)

protected_areas = pd.pivot_table(
    df,
    index='ISO3',          # 行维度:国家ISO3代码
    columns='STATUS_YR',   # 列维度:保护区设立年份
    aggfunc='count',       # 统计各分组的数量
    values='STATUS_YR',    # 任意存在的列都可,这里用STATUS_YR本身
    fill_value=0           # 无数据的年份填充0
).reset_index()

如果一定要用循环(不推荐)

如果坚持要用循环处理已分组的wdpa4_grouped,可以修改为:

protected_areas = pd.DataFrame()

for key, group in wdpa4_grouped:
    # 统计当前国家各年份的保护区数量
    year_counts = group['STATUS_YR'].value_counts().rename(key).to_frame().T
    # 拼接到结果DataFrame中
    protected_areas = pd.concat([protected_areas, year_counts], axis=0)

# 填充缺失年份为0,转换为整数类型,重置索引并修正列名
protected_areas = protected_areas.fillna(0).astype(int).reset_index().rename(columns={'index': 'ISO3'})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:40:31