Python 沿不同轴广播逻辑运算符

Python 沿不同轴广播逻辑运算符,python,pandas,Python,Pandas,我有一个数据帧和一个系列: np.random.seed(0) df = pd.DataFrame(np.random.binomial(1, 0.3, (5, 4)).astype(bool)) ser = pd.Series(np.random.binomial(1, 0.3, 5).astype(bool)) df 输出: 0 1 2 3 0错误-正确-错误-错误 1假假假真 2对错对错 3假真假假 4假对真对 ser 输出: 0对 1正确 2错误 3正确

我有一个数据帧和一个系列:

np.random.seed(0)
df = pd.DataFrame(np.random.binomial(1, 0.3, (5, 4)).astype(bool))
ser = pd.Series(np.random.binomial(1, 0.3, 5).astype(bool))
df 输出: 0 1 2 3 0错误-正确-错误-错误 1假假假真 2对错对错 3假真假假 4假对真对 ser 输出: 0对 1正确 2错误 3正确 4错误 数据类型:bool 我想逐行比较每一列和序列,看看这两个元素是否都是真的。结果应该是:

0 1 2 3 0 False True False False 1 False False False True 2 False False False False 3 False True False False 4 False False False False 0 1 2 3 0错误-正确-错误-错误 1假假假真 2假假假假 3假真假假 4假假假假假 我可以使用
df.mul(ser,axis=0)
执行此操作,但它会引发一个警告:

UserWarning:在Python空间中求值,因为“*”运算符是 numexpr不支持bool数据类型,请改用“&”


我猜这会减慢操作速度。有其他选择吗?

因为此计算基于数组(无需对齐索引标签), 您可以使用NumPy阵列和NumPy广播来计算:

np.logical_and(df.values, ser.values[:, None])

以下是几个备选方案的速度比较:

import numpy as np
import pandas as pd

N, M = 500, 400
np.random.seed(0)
df = pd.DataFrame(np.random.binomial(1, 0.3, (N, M)).astype(bool))
ser = pd.Series(np.random.binomial(1, 0.3, N).astype(bool))

import numpy as np
import pandas as pd

N, M = 500, 400
np.random.seed(0)
df = pd.DataFrame(np.random.binomial(1, 0.3, (N, M)).astype(bool))
ser = pd.Series(np.random.binomial(1, 0.3, N).astype(bool))
In [60]: %timeit pd.DataFrame(np.logical_and(df.values, ser.values[:, None]), columns=df.columns, index=df.index)
10000 loops, best of 3: 93.4 µs per loop

In [51]: %timeit pd.DataFrame(df.values * ser.values[:,None], columns=df.columns, index=df.index)
10000 loops, best of 3: 94.4 µs per loop

In [47]: %timeit df.mul(ser, axis=0)
UserWarning: evaluating in Python space because the '*' operator is not supported by numexpr for the bool dtype, use '&' instead
10000 loops, best of 3: 166 µs per loop

In [46]: %timeit df.apply(lambda x: x & ser)
10 loops, best of 3: 135 ms per loop