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

Pandas for循环追加DataFrame行时丢失UK对应新增行问题排查

问题产生原因
  • 你遍历的是df.con整列,该列有3个重复的UK、3个重复的US,合计会循环6次。每次循环首次赋值s时,你都是从原始未修改的n_df_2上追加新行,直接覆盖了上一轮循环生成的结果,最终只有最后几次处理US的循环结果被保留,UK的衍生行完全被覆盖丢失。
  • 你没有提前初始化结果容器,每次循环都重新生成结果表,前序处理的UK数据自然不会被保留。
  • 额外注意:你用str.contains做匹配存在误匹配风险,比如如果有国家名互相包含的场景会匹配错误,推荐直接用等值判断更稳妥。
修复后的代码
import pandas as pd
d = { 'year': [2019,2019,2019,2020,2020,2020], 
      'age group': ['(0-14)','(14-50)','(50+)','(0-14)','(14-50)','(50+)'], 
      'con': ['UK','UK','UK','US','US','US'],
      'population': [10,20,300,400,1000,2000]}
df = pd.DataFrame(data=d)

new_list = ['young vs child','old vs young', 'unemployed vs working']
age_list = df['age group'].unique().tolist()
# 初始化结果表为原始数据副本
s = df.copy()

# 仅遍历去重后的国家,避免重复循环
for country in df['con'].unique():
    # 直接等值匹配,避免contains的误匹配问题,取max避免多值报错
    bev_child_pop = df[(df['con'] == country) & (df['age group'] == age_list[0])]['population'].max()
    bev_work_pop = df[(df['con'] == country) & (df['age group'] == age_list[1])]['population'].max()
    bev_old_pop = df[(df['con'] == country) & (df['age group'] == age_list[2])]['population'].max()
    # 取当前国家的基准行,复制后修改,避免链式索引警告
    base_row = df[(df['con'] == country) & (df['age group'] == age_list[0])].iloc[[0]].copy()
    
    # 第一条衍生行
    row1 = base_row.copy()
    row1['population'] = bev_work_pop / bev_child_pop
    row1['con'] = f"{country}-{new_list[0]}"
    row1['age group'] = new_list[0]
    s = pd.concat([s, row1], ignore_index=True)
    
    # 第二条衍生行
    row2 = base_row.copy()
    row2['population'] = (bev_work_pop / bev_child_pop) + (bev_old_pop / bev_work_pop)
    row2['con'] = f"{country}-{new_list[2]}"
    row2['age group'] = new_list[2]
    s = pd.concat([s, row2], ignore_index=True)
    
    # 第三条衍生行
    row3 = base_row.copy()
    row3['population'] = bev_old_pop / bev_work_pop
    row3['con'] = f"{country}-{new_list[1]}"
    row3['age group'] = new_list[1]
    s = pd.concat([s, row3], ignore_index=True)

print(s)
修复说明
  • 改为遍历df['con'].unique()去重后的国家列表,仅循环2次分别处理UK和US,避免重复循环。
  • 提前初始化结果表s为原始数据的副本,每次循环都直接往s中追加新行,不会覆盖之前的结果。
  • 改用等值判断匹配数据,避免str.contains的误匹配问题,同时提前提取各年龄组的人口数值,代码逻辑更清晰。
  • 用pd.concat替代已经被pandas废弃的append方法,兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:00:04