Pandas使用concat在循环迭代中拼接DataFrame的方案咨询
解决方案
你要的实现逻辑和列表append的写法几乎完全一致,不需要提前在循环外获取第一个DataFrame,官方更推荐的性能最优方案如下:
首选方案:先存列表再一次性拼接
这种方案的时间复杂度是线性的,哪怕循环生成上千个DataFrame也不会有明显性能损耗,写法和你给出的列表示例逻辑完全对齐:
import pandas as pd # 先初始化空列表存储每次生成的DataFrame df_buffer = [] for i in range(10): # 替换为你实际生成单份DataFrame的逻辑 current_df = pd.DataFrame({ "col1": [i, i*2], "col2": [i**2, i**3] }) df_buffer.append(current_df) # 循环结束后一次性完成拼接 result_df = pd.concat(df_buffer, ignore_index=True)
参数说明:如果需要保留每个子DataFrame的原始索引,去掉ignore_index=True即可,加这个参数会生成从0开始的连续新索引。
可选方案:循环中逐步拼接(仅小数据量场景使用)
只有当你每轮迭代都必须拿到当前完整拼接后的DataFrame时,才建议用这种写法,这种写法每次concat都会生成全新的DataFrame对象,循环次数较多时性能会大幅下降:
import pandas as pd result_df = pd.DataFrame() for i in range(10): current_df = pd.DataFrame({ "col1": [i, i*2], "col2": [i**2, i**3] }) # 直接和已有的结果拼接 result_df = pd.concat([result_df, current_df], ignore_index=True)
常见疑问解答
- 为什么官方不推荐预创建空DataFrame再逐行赋值?
因为逐行赋值的性能比上述列表缓存方案差得多,和循环中反复concat的性能损耗接近,没有必要用这种写法。 - 列结构不一致能不能用这个方案?
可以,pd.concat会自动把缺失的列填充为NaN,只要你能接受这个逻辑就可以正常使用。
内容的提问来源于stack exchange,提问作者Jarek
相关产品推荐
相关产品推荐

