PAYATHON 2026

为什么修改 df_temp 会影响原 DataFrame?

数据阿明

结论

df_temp = df 不会创建副本。两个变量指向同一个 DataFrame,因此通过 df_temp 修改列,df 中也会看到变化。Copy-on-Write 不会改变普通变量赋值的行为。

原因

这行代码:

df_temp = df

让 df_temp 成为同一个对象的另一个引用。接下来执行:

df_temp["a"] = df_temp["a"].replace(1, 999)

会修改这个 DataFrame 的列。由于 df 也指向该对象,df["a"] 同样会显示 [999, 2]。

Copy-on-Write 处理的是不同 pandas 对象共享底层数据的情况。写入其中一个对象时,pandas 会在需要时分离数据。它不会改变 Python 的变量赋值语义,也不会让两个变量名自动对应两个 DataFrame。

创建独立对象

要获得独立的 DataFrame,可以显式复制:

import pandas as pd

pd.options.mode.copy_on_write = True

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df_temp = df.copy()
df_temp["a"] = df_temp["a"].replace(1, 999)

print(df["a"].tolist())       # [1, 2]
print(df_temp["a"].tolist())  # [999, 2]

df.copy() 默认创建深拷贝,适合需要明确获得独立 DataFrame 的情况。

启用 Copy-on-Write 后,也可以使用浅拷贝:

df_temp = df.copy(deep=False)

浅拷贝最初可以与 df 共享底层数据。写入时,Copy-on-Write 会隔离受影响的数据,因此修改不会反映到 df。如果代码需要兼容不同配置,或希望复制行为更直观,使用默认的 df.copy() 更容易理解。

注意事项

判断是否需要复制,先确认是否创建了新的 DataFrame 对象:df_temp = df 是别名赋值;df.copy() 和 df.copy(deep=False) 会创建另一个 DataFrame。Copy-on-Write 负责隔离对象间共享数据时的写入,不能替代显式创建对象。

备注:内容仅供参考。