You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中将行从一个DataFrame追加到另一个的最高效方案

性能瓶颈原因

DataFrame.append() 方法每次调用都会生成全新的DataFrame对象,需要完整复制原有df2的全部数据再拼接新行,循环执行时复制成本随循环次数线性上涨,整体时间复杂度为平方级,是性能差的核心原因。且目前pandas新版本已正式弃用append接口,推荐使用更高效的concat实现拼接。

最优解决方案

核心逻辑是避免逐行操作,一次性完成所有待追加行的拼接,根据你的使用场景可以二选一:

场景1:可提前确定所有要追加的行索引

如果能提前整理好需要从df中选取的行索引列表,直接批量筛选后一次性拼接即可,性能最高:

import pandas as pd
import numpy as np

# 你的原始数据(和你原有逻辑一致)
data2 = [['Name 1', 20, 20, 15, 20], ['Name 2', 15, 10, 10, 8]]
df2 = pd.DataFrame(data2, columns=['Name', 1, 2, 3, 4])

data1 = [['New 1', 5, 10, 15, 20], ['New 2', 2, 5, 10 , 20]]
df = pd.DataFrame(data1, columns=['Name', 1, 2, 3, 4])

# 提前整理你要追加的行索引,比如要加第0、1行就填[0,1]
target_rows = [0, 1]
# 一次性筛选所有待追加的行
to_append = df.iloc[target_rows]
# 拼接两个DataFrame,ignore_index=True会自动重置索引避免重复
df2 = pd.concat([df2, to_append], ignore_index=True)

运行后结果和你逐行append完全一致,数百行的场景下性能可以提升数十倍。

场景2:必须在循环中逐行判断是否追加

如果你的筛选逻辑复杂,无法提前确定所有待加行索引,就先把符合要求的行存在普通Python列表中,循环结束后再一次性转成DataFrame拼接:

# 初始化空列表存待追加的行
append_list = []

# 你的循环逻辑
for idx in range(len(df)):
    # 此处写你的判断条件,满足条件就把行加入列表
    if 你的判断逻辑:
        append_list.append(df.iloc[idx].to_dict())

# 循环结束后统一拼接
append_df = pd.DataFrame(append_list)
df2 = pd.concat([df2, append_df], ignore_index=True)

这种方案只需要做一次DataFrame拼接操作,同样远高于逐行append的性能。

内容的提问来源于stack exchange,提问作者Scott Woodhall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:27:04