看利用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。