循环中Pandas DataFrame的append方法失效问题排查
问题原因与解决方案
核心问题1:DataFrame.append() 不会原地修改原对象
pandas 的 append() 方法不会直接修改原DataFrame,而是返回一个包含追加后数据的新DataFrame。你在循环中只调用了 new_data.append(df2),但没有把返回的新对象重新赋值给 new_data,所以原 new_data 始终没有变化。
哪怕是你单独执行的那段代码,df1.append(df2) 也只是返回了新的DataFrame,原 df1 其实并没有被修改——你在交互式环境中看到的结果只是方法返回的新对象,而非原 df1 的变化。
核心问题2:循环范围写法错误
range(len(5)) 是完全错误的写法:整数 5 没有长度属性,执行这段代码会直接抛出 TypeError: object of type 'int' has no len()。要实现循环5次,应该直接写 range(5)。
修正后的代码
方案1:修复append的赋值问题
import pandas as pd new_data = pd.DataFrame({"a":[1, 2, 3, 4], "b":[5, 6, 7, 8]}) # 修正循环范围,并且将append结果重新赋值 for i in range(5): df2 = pd.DataFrame({"a":[1, 2, 3], "b":[5, 6, 7]}) new_data = new_data.append(df2, ignore_index=True) print(new_data) print(f"最终行数:{len(new_data)}") # 输出19,符合预期
注意:
ignore_index=True是为了重置索引,避免出现重复的索引值。
方案2:推荐使用 pd.concat()(pandas 2.0+ 已弃用append)
因为 DataFrame.append() 在pandas 2.0及以上版本已经被标记为弃用,更高效的方式是先收集所有要追加的DataFrame,再一次性用 pd.concat() 合并:
import pandas as pd new_data = pd.DataFrame({"a":[1, 2, 3, 4], "b":[5, 6, 7, 8]}) # 收集所有要追加的DataFrame append_dfs = [] for i in range(5): append_dfs.append(pd.DataFrame({"a":[1, 2, 3], "b":[5, 6, 7]})) # 合并原DataFrame和所有追加的DataFrame new_data = pd.concat([new_data] + append_dfs, ignore_index=True) print(new_data)
内容的提问来源于stack exchange,提问作者Darshil
相关产品推荐
相关产品推荐

