对一个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
相关产品推荐
相关产品推荐

