Python while循环未向DataFrame追加值导致导出CSV内容缺失
问题原因
- 核心原因是pandas的
DataFrame.append()方法不是原地操作:调用该方法后不会修改原有maxlevel对象,只会返回拼接完成的新DataFrame。你的代码中没有将返回的新对象重新赋值给maxlevel,所以循环内的所有追加操作都没有生效,maxlevel始终保留初始赋值的内容。 - 额外说明:
append()方法在pandas 2.0及以上版本已经被正式弃用,即使补全赋值逻辑也会触发版本告警,更推荐使用pd.concat()实现DataFrame拼接。
修复后的代码
import pandas as pd df = pd.read_csv('C:/Users/ymx19/Desktop/EHS/Location/results/Batch3_enterprise_with_missing_level/HOU.csv',header = 0) df = df.dropna(axis ='columns',how ='all') headers_list = [x for x in df.columns] count = len(headers_list) k = headers_list[-1] maxlevel = df[df[k].notna()].drop_duplicates(subset= headers_list, keep="last") while count > 3: m = headers_list[-1] headers_list.pop() z = headers_list[-1] lower_level = df.drop_duplicates(subset=headers_list, keep="last") lower_level = lower_level[lower_level[z].notna() & lower_level[m].isna()] # 替换原有append逻辑,用concat拼接后重新赋值给maxlevel maxlevel = pd.concat([maxlevel, lower_level], ignore_index=True) count -= 1 maxlevel.to_csv('C:\\Users\\ymx19\\Desktop/EHS\\Location\\results\\test\\HOU.csv', index = False)
改动说明
- 把原来的
maxlevel.append(lower_level)替换为maxlevel = pd.concat([maxlevel, lower_level], ignore_index=True),既解决了赋值问题,也兼容新版pandas的语法要求 - 新增的
ignore_index=True参数会重置拼接后DataFrame的行索引,避免出现重复索引的问题,如果需要保留原有索引可以删除该参数。
内容的提问来源于stack exchange,提问作者Yumeng Xu
相关产品推荐
相关产品推荐

