为什么在修改整个DataFrame的副本时,copy_on_write机制不起作用?
使用 pd.options.mode.copy_on_write = True 时,写入副本时原对象不应被修改。不过,当我重新给副本中的某一列赋值时,原对象会受到影响。
import pandas as pd
pd.options.mode.copy_on_write = True
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df_temp = df
df_temp["a"] = df_temp["a"].replace(1, 999)
避免此问题的唯一方法是使用 df_temp = df.copy() 吗?我在使用pandas 2.3.3。
解决方案
来自 copy-on-write文档(强调为原作者所加):
CoW的意思是,任何以某种方式从另一个DataFrame或 Series派生的对象,在任何情况下都始终表现得像一个拷贝。因为这个原因,我们只能通过修改对象本身来改变对象的值。CoW不允许就地更新与 另一个DataFrame或 Series对象 共享数据的DataFrame或 Series。
你之所以会出现这种行为,是因为 df_temp 并不是一个“来自于”DataFrame 的“另一个”,也不是从 df 派生的对象,更不是 df 的“拷贝”。由于Python的赋值运算符的语义,它字面上就是 df 本身:
import pandas as pd
pd.options.mode.copy_on_write = True
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df_temp = df
assert df is df_temp
因此,CoW不会生效;就此而言,Pandas甚至不可能为此添加支持,因为 赋值不可被重载。
df_temp = df.copy() 也没问题,对我来说,它比依赖隐式的CoW更清晰。若你实际上并不需要 df 在 df_temp 中的全部内容,你也可以只对你将要使用的列进行索引;索引确实会创建一个新的 DataFrame,因此CoW将按你预期地触发。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。