2016-10-02 106 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