【Pandas】複数条件に当てはまる行をデータフレームから抽出する

状況

pandasのデータフレームから複数の条件を満たす行を抽出(検索)したい。特に、複数の列で条件を指定したい。

例えば、以下のようなデータフレームについて、x列が2未満またはy列が9以上の行を抽出したい。

df = pd.DataFrame({'x': [0, 1, 2, 3, 4],
                   'y': [5, 6, 7, 8, 9],
                   'z': ['a', 'b', 'c', 'd', 'e']})
xyz
005a
116b
227c
338d
449e

解決法

以下のように指定してlocを使うことで、複数の条件を満たす行を抽出できます。

condition = (df.x < 2) | (df.y >= 9)
df.loc[condition]
xyz
005a
116b
449e

条件を満たす行の特定の列に対して値の代入もできます。

df.loc[condition, 'z'] = 'hoge'
df
xyz
005hoge
116hoge
227c
338d
449hoge

ちなみに、query()でも同様の抽出はできますが、その場合は値の代入ができません。

df.query('x < 2 | y >=9').z = 'hoge'

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
self[name] = value

値を代入したい場合はlocを使いましょう。

Pandasのバージョン0.25.1で動作確認しています。

df.loc more than 2 conditions - Stack Overflow

コメント