Python 熊猫中的广播布尔运算

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

假设我有一个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     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