Pandas 2.0+ 中 df.append() 已被彻底移除,须用 pd.concat() 替代:先将新记录构造成 DataFrame,再与原 df 一次性拼接并设 ignore_index=True;避免循环 concat 和私有 API,推荐批量收集后统一处理。

用 pd.concat() 替代 df.append()
df.append() 在 Pandas 2.0+ 已被彻底移除,继续用会报 AttributeError: 'DataFrame' object has no attribute 'append'。不是“不推荐”,是根本不存在了。
正确做法是用 pd.concat() 拼接 DataFrame 或 Series:
- 新记录为字典或 Series:先构造成单行
pd.DataFrame([{'col1': val1, 'col2': val2}]),再传给pd.concat([df, new_df], ignore_index=True) - 避免反复拼接:每次
pd.concat()都会复制整个 DataFrame,若需追加多条,先收集所有新记录为一个列表,最后一次性拼接 -
ignore_index=True必须显式指定,否则索引会保留原样(可能重复或跳号)
单行追加时,loc + len(df) 看似快但有陷阱
有人用 df.loc[len(df)] = [val1, val2] 直接写入,确实不触发复制,但仅在以下情况安全:
- 目标列名与
df.columns严格一致,且顺序相同;否则会静默丢数据或报ValueError: cannot set a row with mismatched columns - 所有列类型兼容:比如某列为
int64,而新值是None或 float,Pandas 会强制转成float64并填充NaN,可能破坏下游类型假设 - 该操作会修改原
df,无法链式调用,也不利于函数式风格
批量追加超千条记录?别碰 pd.concat() 循环
循环调用 pd.concat() 是典型性能反模式——时间复杂度接近 O(n²)。实测追加 5000 行,比一次性拼接慢 20 倍以上。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
更稳的路径是:
- 把所有待追加数据先存进 Python 列表:
rows = [],每次rows.append({'a': x, 'b': y}) - 一次性转成 DataFrame:
new_df = pd.DataFrame(rows) - 最终一次
pd.concat([df, new_df], ignore_index=True) - 如果原始
df极大(千万行级),且内存敏感,可考虑用modin.pandas或分块写入 Parquet
为什么不用 df._mgr.insert() 这类底层方法?
有人翻源码找到类似 _mgr.insert() 或 _set_item() 的内部接口,试图绕过校验提速。这不可取:
- 下划线前缀表示私有 API,Pandas 不保证向后兼容,0.25 和 2.2 版本间行为可能完全不同
- 跳过类型推断和索引对齐,极易引发隐性错误(如布尔列混入字符串后变成 object 类型,后续
.sum()返回 0 而非报错) - 调试困难:错误堆栈不指向你的代码,而是底层 block manager,排查成本陡增
真正的高效不在于“绕开 Pandas”,而在于尊重它的数据模型——批量构造、一次合并、类型前置声明(如用 pd.ArrowDtype 或 pd.StringDtype() 显式指定列类型)。

















