为什么“&=”会在熊猫数据框中插入?

时间:2020-05-12 14:39:28

标签: pandas dataframe

mask = pd.DataFrame(index=[1,2,3], data=[True, False, True])
d = {}
d[1] = mask
mask &= False
print(d[1])

我认为d [1]仍为[True,False,True],但实际上它变为[False,False,False]

为什么&=就地进行?

如果我更改为mask = mask & False,则d [1]不会更改。

2 个答案:

答案 0 :(得分:1)

是分配和计算,它将更改相同的object

#mask &= False

mask = mask & False

修复

mask = pd.DataFrame(index=[1,2,3], data=[True, False, True])
d = {}
d[1] = mask.copy() # add copy here
mask &= False 
print(d[1])
       0
1   True
2  False
3   True

更多细节

mask = pd.DataFrame(index=[1,2,3], data=[True, False, True])
d = {}
d[1] = mask
id(mask),id(d[1]) # same object 
Out[482]: (2558679905288, 2558679905288)


d[1] = mask.copy()
id(mask),id(d[1]) # diff object so change one another one stay the same 
Out[484]: (2558679850184, 2558674488968)

答案 1 :(得分:1)

Pandas数据帧是指针,x=是Python中的就地运算符。因此,当您这样做时:

mask &= False

您对mask指向的对象进行就地操作。

但是

mask = mask & False 

是不同的。 mask & False创建一个新对象,mask = new_object指向mask指向新对象,而d[1]指向mask先前指向的对象。因此,在执行上述命令后,maskd[1]是两个不同的对象。您可以在分配前后使用id(d[1]) == id(mask)进行验证。