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

为何DataFrame副本的索引列会同步到原数据?如何避免?

解决方法

问题核心在于**df1 = df并没有创建DataFrame的独立副本**,只是让df1成为原DataFrame的引用别名——后续对df1的所有修改都会直接同步到原df上。

要彻底隔离原数据和检查用的副本,只需把赋值语句改成真正的拷贝:

  • 将df1 = df替换为df1 = df.copy()

修改后的完整代码:

d0 = {'col1': [0, 1, 1, 2], 'col2': [3,4,7,8]}
d1 = {'a':'e', 'b':'e','c':'f','d':'g'}
df = pd.DataFrame(data=d0, index=['a','b','c','d'])

def func(df):
    # 创建原DataFrame的深副本,完全隔离原数据
    df1 = df.copy()
    # 用index.map替代循环,更简洁高效
    df1['mapped index'] = df1.index.map(d1.get)
    df1 = df1.set_index('mapped index', append=True)
    df1 = df1.droplevel(0)
    checks = []
    for col in df1:
        check = df1.loc['f', col] == df1.loc['e', col].sum()
        checks.append(check)
    return all(checks)

checks = func(df)
print("Checks: ", checks)
print(df)

运行后原df不会再出现mapped index列,输出结果:

Checks:  True
   col1  col2
a     0     3
b     1     4
c     1     7
d     2     8

补充说明:df.copy()默认是深拷贝(deep=True),会完整复制所有数据结构;如果确认数据没有嵌套对象,也可以用df.copy(deep=False)做浅拷贝,性能略高,但深拷贝在大多数场景下更安全。

内容的提问来源于stack exchange,提问作者konstantintre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:33:23