使用多个布尔列过滤pandas数据帧

May*_*ary 18 python boolean numpy dataframe pandas

我试图使用几个布尔变量来过滤df,这些变量是df的一部分,但是无法这样做.

样本数据:

A | B | C | D
John Doe | 45 | True | False
Jane Smith | 32 | False | False
Alan Holmes | 55 | False | True
Eric Lamar | 29 | True | True
Run Code Online (Sandbox Code Playgroud)

列C和D的dtype是布尔值.我想创建一个新的df(df1),其中只有C或D为True的行.它应该如下所示:

A | B | C | D
John Doe | 45 | True | False
Alan Holmes | 55 | False | True
Eric Lamar | 29 | True | True
Run Code Online (Sandbox Code Playgroud)

我尝试过类似这样的问题,因为它无法处理布尔类型:

df1 = df[(df['C']=='True') or (df['D']=='True')]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Max*_*axU 30

In [82]: d
Out[82]:
             A   B      C      D
0     John Doe  45   True  False
1   Jane Smith  32  False  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)

解决方案1:

In [83]: d.loc[d.C | d.D]
Out[83]:
             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)

解决方案2:

In [94]: d[d[['C','D']].any(1)]
Out[94]:
             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)

解决方案3:

In [95]: d.query("C or D")
Out[95]:
             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)

PS如果您将解决方案更改为:

df[(df['C']==True) | (df['D']==True)]
Run Code Online (Sandbox Code Playgroud)

它也会起作用

Pandas docs - 布尔索引

  • `df[(df.var == True)].count()` 为我触发 E712 (使用 is True 而不是 ==) (3认同)

cs9*_*s95 8

万岁!更多的选择!

np.where

df[np.where(df.C | df.D, True, False)]

             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True  
Run Code Online (Sandbox Code Playgroud)

pd.Series.wheredf.index

df.loc[df.index.where(df.C | df.D).dropna()]

               A   B      C      D
0.0     John Doe  45   True  False
2.0  Alan Holmes  55  False   True
3.0   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)

df.select_dtypes

df[df.select_dtypes([bool]).any(1)]   

             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)

滥用 np.select

df.iloc[np.select([df.C | df.D], [df.index])].drop_duplicates()

             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

或者

d[d.eval('C or D')]

Out[1065]:
             A   B      C      D
0     John Doe  45   True  False
2  Alan Holmes  55  False   True
3   Eric Lamar  29   True   True
Run Code Online (Sandbox Code Playgroud)