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

对一个DataFrame做布尔索引赋值为何会修改另一个DataFrame的值

问题原因

你遇到的这个问题本质是Python的可变对象引用赋值规则导致的,和Python、Pandas版本无直接关联:

  • Python中对列表、字典、Pandas DataFrame/Series这类可变对象执行直接赋值(a = b)时,不会生成新的独立对象,只是给原内存对象额外绑定了一个变量名,所有变量实际指向同一个底层数据。
  • 你代码中的data_pos = data、data_neg = data只是给原始data对象创建了两个别名,后续修改data_pos、data_neg本质都是修改同一个数据,因此data的内容会同步变化。

解决方法

如果需要生成独立的、修改不影响原对象的副本,调用Pandas提供的.copy()方法即可,默认是深拷贝,会完全复制底层数据:

>>> import pandas as pd
>>> data = pd.DataFrame(data={'A':[-3,-2,-1,0,0,1,2,3]})
>>> print(data)
   A
0 -3
1 -2
2 -1
3  0
4  0
5  1
6  2
7  3
>>> data_pos = data.copy()  # 生成独立的正样本处理副本
>>> data_neg = data.copy()  # 生成独立的负样本处理副本
>>>
>>> data_pos.loc[data_pos.loc[:,'A']<0,'A']=0
>>> data_neg.loc[data_neg.loc[:,'A']>0,'A']=0
>>>
>>> # 原data不会被修改
>>> print(data)
   A
0 -3
1 -2
2 -1
3  0
4  0
5  1
6  2
7  3

补充说明:.copy()方法默认参数deep=True,会完全复制数据和索引的底层数组,生成完全独立的副本;如果设置deep=False仅复制数据结构,底层数据仍和原对象共享,修改仍会相互影响,常规场景使用默认参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 03:54:05