私は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
列CおよびDのdtypeはブール値です。 CまたはDのいずれかがTrueである行のみを含む新しいdf(df1)を作成します。次のようになります。
A | B | C | D
John Doe | 45 | True | False
Alan Holmes | 55 | False | True
Eric Lamar | 29 | True | True
ブール型を処理できないため、問題に直面するこのようなものを試しました:
df1 = df[(df['C']=='True') or (df['D']=='True')]
何か案は?
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
ソリューション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
ソリューション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
ソリューション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
PSソリューションを次のように変更した場合:
df[(df['C']==True) | (df['D']==True)]
それも動作します
「PEP苦情」を使用しない理由
df["col_name"] is True
の代わりにdf["col_name"] == True
?
In [11]: df = pd.DataFrame({"col":[True, True, True]})
In [12]: df
Out[12]:
col
0 True
1 True
2 True
In [13]: df["col"] is True
Out[13]: False # <----- oops, that's not exactly what we wanted
やった!より多くのオプション!
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
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
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
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
または
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