2016-10-02 89 views
2

假设我有一个bool DataFrame df和一个bool Series x具有相同的索引,我想要在每列dfx之间进行逻辑运算。与使用DataFrame.apply相比,有没有像DataFrame.sub那样的简短而快速的方法?如何在DataFrame和Series之间进行逻辑运算?

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 

回答

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]))

另一个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