Python 熊猫中的广播布尔运算
假设我有一个NxM布尔数据框X和一个Nx1布尔数据框Y。我想对返回一个新数据框(即NxM)的每一列执行一个布尔运算。例如:Python 熊猫中的广播布尔运算,python,pandas,Python,Pandas,假设我有一个NxM布尔数据框X和一个Nx1布尔数据框Y。我想对返回一个新数据框(即NxM)的每一列执行一个布尔运算。例如: x = pd.DataFrame([[True, True, True], [True, False, True], [False, False, True]]) y = pd.DataFrame([[False], [True], [True]]) 我希望x&y返回: 0 1 2 0 False False False 1 Tru
x = pd.DataFrame([[True, True, True], [True, False, True], [False, False, True]])
y = pd.DataFrame([[False], [True], [True]])
我希望x&y返回:
0 1 2
0 False False False
1 True False True
2 False False True
但相反,它返回:
0 1 2
0 False NaN NaN
1 True NaN NaN
2 False NaN NaN
相反,将y视为具有
x&y[0]
给出:
它似乎是按行广播的。除了将操作应用于序列和取消转换之外,还有其他正确的方法来执行此操作吗
(x.T & y[0]).T
0 1 2
0 False False False
1 True False True
2 False False True
当行索引与列标签不相同时,这似乎失败了。您可以调用
apply
并传递lambda,然后调用square
将序列展平为一维数组:
In [152]:
x.apply(lambda s: s & y.squeeze())
Out[152]:
0 1 2
0 False False False
1 True False True
2 False False True
但是我不确定这是否更快,这里我们通过调用df上的apply
来应用掩码列,这就是为什么不需要转置的原因
实际上,您可以使用:
np.logical_,这似乎很棒。谢谢
In [152]:
x.apply(lambda s: s & y.squeeze())
Out[152]:
0 1 2
0 False False False
1 True False True
2 False False True
In [156]:
np.logical_and(x,y)
Out[156]:
0 1 2
0 False False False
1 True False True
2 False False True