如何在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
相关产品推荐
相关产品推荐

