2016-10-02 3 views
2

Предположим, у меня есть bool DataFrame df и bool Series x с тем же индексом, и я хочу сделать логическую операцию между df и x за столбец. Есть ли короткий и быстрый способ, как DataFrame.sub по сравнению с использованием DataFrame.apply?Как сделать логическую операцию между 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, потому что оператор '*' не поддерживается 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