按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
相关产品推荐
相关产品推荐

