假设我有一个bool DataFrame df
和一个具有相同索引的bool Series x
,我想在每列df
和x
之间进行逻辑运算。是否有DataFrame.sub
与使用DataFrame.apply
相比的简短快捷方式?
In [31]: df
Out[31]:
x y z u
A False False True True
B True True True True
C True False False False
In [32]: x
Out[32]:
A True
B False
C True
dtype: bool
In [33]: r = df.apply(lambda col: col & x) # Any other way ??
In [34]: r
Out[34]:
x y z u
A False False True True
B False False False False
C True False False False
答案 0 :(得分:4)
使用mul
,但需要转为int
,然后转为bool
,因为UserWarning
:
print (df.astype(int).mul(x.values, axis=0).astype(bool))
x y z u
A False False True True
B False False False False
C True False False False
类似的解决方案:
print (df.mul(x.astype(int), axis=0).astype(bool))
x y z u
A False False True True
B False False False False
C True False False False
print (df.mul(x.values, axis=0))
x y z u
A False False True True
B False False False False
C True False False False
C:\ Anaconda3 \ lib \ site-packages \ pandas \ computation \ expressions.py:181:UserWarning:在Python空间中进行评估,因为对于bool dtype,numexpr不支持'*'运算符,请使用'& “代替 不支持[op_str]))
np.logical_and
的另一个numpy
解决方案:
print (pd.DataFrame(np.logical_and(df.values, x.values[:, None]),
index=df.index,
columns=df.columns))
x y z u
A False False True True
B False False False False
C True False False False