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)
它也会起作用
万岁!更多的选择!
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.where
上 df.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)
或者
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)
归档时间: |
|
查看次数: |
25930 次 |
最近记录: |