Pandas深拷贝修改后原对象属性变动,如何创建完全独立的副本?
原因说明
你遇到的是pandas旧版本的已知行为:1.4.x及更早版本中,DataFrame.copy(deep=True) 不会对不可变的Index对象执行深拷贝,原DataFrame和副本会共享同一个Index实例,因此修改副本的索引属性会同步影响原对象,即使你用标准库的copy.deepcopy也会复现该问题。
解决方案
只需要在修改副本索引属性前,单独对副本的Index执行一次拷贝,切断共享关系即可,示例代码如下:
import pandas as pd dr = pd.date_range('2020-01-01', periods=10, freq='1H') test = pd.DataFrame({'target':list(range(10))}, index=dr) print(test.index.freq) # 输出 <Hour> _copy = test.copy(deep=True) # 新增:单独拷贝Index对象,和原对象切断关联 _copy.index = _copy.index.copy() _copy.index.freq = None print(test.index.freq) # 输出 <Hour> 符合预期 print(_copy.index.freq) # 输出 None
如果你希望一步完成,也可以直接重新构造独立的DataFrame:
_copy = pd.DataFrame( data=test.values, # 直接基于原索引的时间戳创建新的DateTimeIndex,默认不带freq index=pd.DatetimeIndex(test.index.to_list()), columns=test.columns )
补充说明
该行为在pandas 1.5.0及以上版本已被优化,deep=True会同步拷贝Index对象,升级pandas版本也可以解决该问题。
内容的提问来源于stack exchange,提问作者mosc9575
相关产品推荐
相关产品推荐

