如何在DataFrame和Series之间进行逻辑操作?

时间:2016-10-02 16:49:00

标签: python pandas dataframe boolean logical-operators

假设我有一个bool DataFrame df和一个具有相同索引的bool Series x,我想在每列dfx之间进行逻辑运算。是否有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

1 个答案:

答案 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