为何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
相关产品推荐
相关产品推荐

