如何在DataFrame和Series之间进行逻辑运算?

Eas*_*sun 2 python boolean logical-operators dataframe pandas

假设我有一个布尔值DataFrame df和一个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
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

使用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
Run Code Online (Sandbox Code Playgroud)

类似的解决方案:

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

C:\ Anaconda3 \ lib \ site-packages \ pandas \ computation \ expressions.py:181:UserWarning:在python空间中进行评估,因为numexpr不支持bool dtype使用'*'运算符,请使用'&'而不支持[ op_str]))

另一个numpy解决方案np.logical_and

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
Run Code Online (Sandbox Code Playgroud)