状況
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']})
x | y | z | |
---|---|---|---|
0 | 0 | 5 | a |
1 | 1 | 6 | b |
2 | 2 | 7 | c |
3 | 3 | 8 | d |
4 | 4 | 9 | e |
解決法
以下のように指定してloc
を使うことで、複数の条件を満たす行を抽出できます。
condition = (df.x < 2) | (df.y >= 9)
df.loc[condition]
x | y | z | |
---|---|---|---|
0 | 0 | 5 | a |
1 | 1 | 6 | b |
4 | 4 | 9 | e |
条件を満たす行の特定の列に対して値の代入もできます。
df.loc[condition, 'z'] = 'hoge'
df
x | y | z | |
---|---|---|---|
0 | 0 | 5 | hoge |
1 | 1 | 6 | hoge |
2 | 2 | 7 | c |
3 | 3 | 8 | d |
4 | 4 | 9 | hoge |
ちなみに、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で動作確認しています。
Attention Required! | Cloudflare
コメント