DataFrame布尔索引的赋值问题

看利用PYTHON进行数据分析中有这样一个示例,比较难以理解,请帮忙解答一下。

>>> data=pd.DataFrame(data=pd.DataFrame(np.arange(18).reshape(6,3)))
>>> data
    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
5  15  16  17
布尔索引并赋值:
>>> data[data>5]=np.sign(data)
>>> data
   0  1  2
0  0  1  2
1  3  4  5
2  1  1  1
3  1  1  1
4  1  1  1
5  1  1  1
>>> 

按照逻辑:
>>> data[data>5]
      0     1     2
0    x   x   x
1   x   x   x
2   6.0   7.0   8.0
3   9.0  10.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
>>> 
>>> np.sign(data)
   0  1  2
0  0  1  1
1  1  1  1
2  1  1  1
3  1  1  1
4  1  1  1
5  1  1  1

按说两个DataFrame应该是逐一元素赋值的,为什么上面x=NAN
部分没有被赋值呢,还是他们有什么规则,还是我理解有偏差。

要明白data>5是对data的索引和选择的过程,只有满足条件的位置才会被选择和操作,其余的不参与,所以这里会把no.sign(data)对应的位置赋值给data,其他位置不变

谢谢反馈,验证一下确实是这样的。

>>> data=pd.DataFrame(data=pd.DataFrame(np.arange(18).reshape(6,3)))
>>> data
    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
5  15  16  17
>>> 
读取没问题:
>> data[data>5][0][0]
nan
写入不行了:

>>> data[data>5][0][0]=1
>>> data
    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
5  15  16  17
>>> 

如果将结果保存,新副本:
>>> aa=data[data>5]
>>> aa
      0     1     2
0   NaN   NaN   NaN
1   NaN   NaN   NaN
2   6.0   7.0   8.0
3   9.0  10.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
>>> 
>>> aa[0][0]=1
>>> aa
      0     1     2
0   1.0   NaN   NaN
1   NaN   NaN   NaN
2   6.0   7.0   8.0
3   9.0  10.0  11.0
4  12.0  13.0  14.0
5  15.0  16.0  17.0
>>> 
副本被修改了。

问题来了,通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此。

data[data>5]是不是副本,如果是更改就不应该影响到data。