假设我有一个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
当行索引与列标签
不同时,似乎失败了答案 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