Python循环遍历列表创建DataFrame时append失效如何解决
问题背景
- 现有名为
profiles的列表,每个元素为单组账户数据,目标是将所有元素整合为同一个pandas DataFrame - 手动逐元素创建DataFrame再追加的方式可正常运行,但列表共约40个元素,手动操作效率过低,需要通过循环实现批量拼接
- 手动实现参考代码:
df2 = pd.DataFrame(profiles[1]) df1 = df1.append(df2) df3 = pd.DataFrame(profiles[2]) df1 = df1.append(df3) ... and so on
- 自行编写的循环代码无法正常追加数据,原错误代码如下:
for y in range(len(profiles)): if x != y: df1 = pd.DataFrame(profiles[x]) df2 = pd.DataFrame(profiles[y]) df1.append(df2)
错误原因
- 核心逻辑错误:
pandas.DataFrame.append()不会在原DataFrame上做修改,会返回拼接后的新对象,原代码没有接收append的返回值,拼接结果不会被保存 - 循环逻辑混乱:每次循环都会重新给
df1赋值为profiles[x]生成的DataFrame,会直接覆盖之前的拼接结果,且代码中x变量未做定义,逻辑不成立 - 逐次append本身性能较差,不属于pandas推荐的批量拼接写法
正确实现方案
推荐方案(性能最优)
直接使用pd.concat()一次性拼接所有子DataFrame,不需要写循环,代码简洁且运行效率最高:
import pandas as pd # 遍历profiles生成所有子DataFrame,一次性完成拼接 final_df = pd.concat([pd.DataFrame(profile) for profile in profiles], ignore_index=True)
参数ignore_index=True会重置拼接后DataFrame的行索引,避免出现索引重复的问题。
循环append方案(不推荐,仅作逻辑参考)
如果一定要用循环逐次追加的写法,需要先初始化空的总DataFrame,且每次append后要把返回值重新赋值给总DataFrame:
import pandas as pd # 初始化空总表 final_df = pd.DataFrame() for profile in profiles: temp_df = pd.DataFrame(profile) # 必须接收append返回值,否则拼接结果不生效 final_df = final_df.append(temp_df, ignore_index=True)
注意:pandas 1.4.0及以上版本已将
DataFrame.append()标记为废弃方法,官方建议优先使用pd.concat()实现拼接需求。
内容的提问来源于stack exchange,提问作者user19319575
相关产品推荐
相关产品推荐

