Pandas の特定の列の値に基づいて DataFrame から行を選択するにはどうすればよいですか?
SQL では、次のように使用します。
SELECT *
FROM table
WHERE column_name = some_value
ベストアンサー1
列の値がスカラーに等しい行を選択するにはsome_value
、 を使用します==
。
df.loc[df['column_name'] == some_value]
列値が反復可能な にある行を選択するにはsome_values
、 を使用しますisin
。
df.loc[df['column_name'].isin(some_values)]
複数の条件を組み合わせる&
:
df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
括弧に注意してください。Pythonの演算子の優先順位の規則は、および&
よりも強く結合します。したがって、最後の例の括弧は必要です。括弧がない場合<=
>=
df['column_name'] >= A & df['column_name'] <= B
は次のように解析されます
df['column_name'] >= (A & df['column_name']) <= B
その結果、シリーズの真理値はあいまいなエラーです。
列の値がと等しくない some_value
行を選択するには、次を使用します!=
。
df.loc[df['column_name'] != some_value]
はisin
ブール型の Series を返すため、に値がないsome_values
行を選択するには、 を使用してブール型の Series を否定します~
。
df = df.loc[~df['column_name'].isin(some_values)] # .loc is not in-place replacement
例えば、
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
収穫
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
含めたい値が複数ある場合は、それらをリスト(またはより一般的には反復可能なもの)に入れて、次のように使用しますisin
。
print(df.loc[df['B'].isin(['one','three'])])
収穫
A B C D
0 foo one 0 0
1 bar one 1 2
3 bar three 3 6
6 foo one 6 12
7 foo three 7 14
ただし、これを何度も実行したい場合は、最初にインデックスを作成してから、次のように使用する方が効率的ですdf.loc
。
df = df.set_index(['B'])
print(df.loc['one'])
収穫
A C D
B
one foo 0 0
one bar 1 2
one foo 6 12
または、インデックスから複数の値を含めるには、次を使用しますdf.index.isin
。
df.loc[df.index.isin(['one','two'])]
収穫
A C D
B
one foo 0 0
one bar 1 2
two foo 2 4
two foo 4 8
two bar 5 10
one foo 6 12