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

