
pandas 的 `merge()` 方法默认返回一个全新的 dataframe,而非就地修改原对象;若要更新原始变量,必须显式赋值,如 `df = df.merge(...)`。
在 Pandas 中,merge() 是一个纯函数式操作:它接收两个 DataFrame 作为输入,执行合并逻辑,并返回一个新的 DataFrame,而绝不会修改任一输入对象的内存内容或结构。这一点与 dropna()、fillna() 等支持 inplace=True 参数的方法有本质区别——merge() 根本不提供 inplace 参数,其文档明确声明返回类型为 DataFrame,且无副作用。
例如,以下代码看似“调用了 merge”,实则只是计算并丢弃了结果:
df.merge(df_new, right_on='Pid', left_on='PassengerId', how='inner') # ❌ 无赋值,结果被丢弃
此时 df 保持完全不变,控制台可能显示合并后的数据(尤其在 Jupyter 或 REPL 中),但这只是 Python 交互环境自动打印表达式返回值的表现,并非 df 自身发生了变化。
✅ 正确做法是显式赋值,覆盖原变量(或赋予新变量名):
df = df.merge(df_new, right_on='Pid', left_on='PassengerId', how='inner') # ✅ 更新 df # 或保留原 df,创建新引用 df_enriched = df.merge(df_new, right_on='Pid', left_on='PassengerId', how='inner')
⚠️ 注意事项:
- 赋值操作(df = ...)并不会“修改”原 DataFrame,而是让变量 df 指向一个全新的对象;原 DataFrame 若无其他引用,将被垃圾回收。
- 若需链式操作(如 df.merge(...).sort_values(...).reset_index()),可放心组合,因每一步均返回新对象。
- 从内存与可维护性角度,推荐使用新变量名(如 df_merged),避免隐式覆盖原始数据,尤其在探索性分析中利于回溯。
总结:Pandas 的设计哲学强调不可变性(immutability) —— 大多数核心方法(merge、concat、groupby().apply() 等)均返回新对象。理解这一原则,是写出清晰、可靠、易调试的 Pandas 代码的关键基础。










