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

如何在Pandas函数中优雅地原地追加DataFrame行?

原地高效追加行到Pandas DataFrame的实现方案

已尝试的两种方案

1. pd.concat(非原地实现)

def append_rows_concat(df, new_rows):
    return pd.concat([df, new_rows], ignore_index=True)
  • 该方法会创建DataFrame副本,必须重新赋值才能更新原对象,并非真正的原地/按引用修改。

2. .loc逐行迭代(原地但低效)

def append_rows_loc(df, new_rows):
    start_index = len(df)
    for i, row in new_rows.iterrows():
        df.loc[start_index + i] = row
  • 直接修改原DataFrame(原地/按引用),无需创建副本,但逐行迭代的方式在处理大型DataFrame时效率极低,且代码可读性差。

核心需求

需要一种既具备pd.concat的优雅、高效特性,又能像.loc那样支持真正原地修改的实现方式:通过引用直接修改主DataFrame,无需通过return df重新赋值,用于学习底层实现逻辑(即使实际场景中复制DataFrame操作成本很低)。

优化后的原地实现方案

通过对齐列后批量赋值的方式,实现高效的原地追加:

def append_rows_inplace(df, new_rows):
    # 对齐列,确保新数据和原DataFrame列一致,缺失列填充NaN
    new_rows_aligned = new_rows.reindex(columns=df.columns)
    # 计算追加的起始索引
    start_idx = len(df)
    # 批量写入数据到原DataFrame的扩展索引位置
    df.loc[start_idx : start_idx + len(new_rows_aligned) - 1] = new_rows_aligned.values

测试验证

初始化代码

import pandas as pd

# 示例DataFrame
df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': ['a', 'b', 'c'],
    'col3': [4, 5, 6]})
df_update = pd.DataFrame({
    'col1': [11, 22],
    'col2': ['aa', 'bb']})
print("原DataFrame:")
print(df)
print("\n待追加数据:")
print(df_update)

输出:

原DataFrame:
   col1 col2  col3
0     1    a     4
1     2    b     5
2     3    c     6

待追加数据:
   col1 col2
0    11   aa
1    22   bb

原地追加测试

append_rows_inplace(df, df_update)
print("\n追加后的原DataFrame:")
print(df)

输出:

追加后的原DataFrame:
   col1 col2  col3
0     1    a   4.0
1     2    b   5.0
2     3    c   6.0
3    11   aa   NaN
4    22   bb   NaN

方案说明

  • 高效性:通过批量赋值替代逐行迭代,效率接近pd.concat,避免了循环带来的性能损耗。
  • 原地修改:直接操作原DataFrame的内存数据,无需返回新对象或重新赋值。
  • 鲁棒性:通过reindex对齐列,自动处理待追加数据与原DataFrame列不匹配的情况,缺失列填充NaN。

内容的提问来源于stack exchange,提问作者M. Photonicker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:25:30