You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:27:02