为什么修改 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 负责隔离对象间共享数据时的写入,不能替代显式创建对象。
备注:内容仅供参考。
