Python 使用numpy数组在数据帧中进行非直观选择
我遇到了一个奇怪的情况,使用布尔numpy数组作为选择数据帧部分的掩码Python 使用numpy数组在数据帧中进行非直观选择,python,numpy,pandas,Python,Numpy,Pandas,我遇到了一个奇怪的情况,使用布尔numpy数组作为选择数据帧部分的掩码 import numpy as np import pandas as pd data = np.ones((3,3)) data[-1, -1] = 10 data = pd.DataFrame(data) data[data==1] data.where(data == 1, np.nan) data.where(np.array(data == 1), np.nan) 所有命令将产生预期输出: 0 1
import numpy as np
import pandas as pd
data = np.ones((3,3))
data[-1, -1] = 10
data = pd.DataFrame(data)
data[data==1]
data.where(data == 1, np.nan)
data.where(np.array(data == 1), np.nan)
所有命令将产生预期输出:
0 1 2
0 1 1 1
1 1 1 1
2 1 1 NaN
[3 rows x 3 columns]
但是,这一条没有:
data[np.array(data==1)]
0 1 2
0 1 1 1
0 1 1 1
0 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
2 1 1 10
2 1 1 10
[8 rows x 3 columns]
这背后的原因是什么?
我在pandas 0.13.1和0.16.0上对此进行了测试。这是一个错误,我在c:\winpython-64bit-3.4.3.1\python-3.4.3.amd64\lib\site packages\pandas\core\internal.py(2437)apply()->用于self.blocks中的b:(Pdb)self.blocks(FloatBlock:slice(0,3,1),3x3,dtype:float64,)这是一个无效的切片,它会导致设置不正确的值:
>c:\winpython-64bit-3.4.3.1\python-3.4.3.amd64\lib\site packages\pandas\core\internal.py(922)eval()->values=self.values(Pdb)self.values数组([[1,1,1.],[1,1.],[1,1,1,1,10.])
根据API,布尔掩码是否允许作为numpy数组?由于缺少索引和列名/标签,所以掩码作为numpy数组而不是序列或数据帧可能会出现问题。虽然data.where(np.array(data==1),np.nan)
在这里似乎是可行的,但我并不认为您应该依赖它。还有一个非常笼统的评论:当混合数组和数据帧时,得到这样奇怪的结果并不罕见。如果您在数组上使用数组掩码或在数据帧上使用数据帧掩码得到这样的结果,则更值得关注。