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