在Pandas中广播布尔运算

时间:2015-10-08 14:27:00

标签: 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     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] 给出:

    0   1   2
0   False   True    True
1   False   False   True
2   False   False   True

似乎是按行广播。有没有一种正确的方法来做到这一点,除了转换应用系列操作而不是转换?

(x.T & y[0]).T


    0   1   2 
0   False   False   False
1   True    False   True
2   False   False   True

当行索引与列标签

不同时,似乎失败了

1 个答案:

答案 0 :(得分:2)

您可以调用apply并传递一个lambda并调用squeeze将系列展平为一维数组:

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_and

In [156]:
np.logical_and(x,y)

Out[156]:
       0      1      2
0  False  False  False
1   True  False   True
2  False  False   True