Pandas の列値に基づいて DataFrame 行をフィルタリングする方法
- 特定の列の値に基づいて Pandas 行を選択する
- 特定の列の値を含まない Pandas 行を選択する
- 列の値が特定の値より大きいか小さい Pandas 行を選択する
- 複数の列の値に基づいて Pandas 行を選択する
- 複数の条件を持つ DataFrame 行を選択
1つまたは複数の列の値に基づいて、DataFrame
の行を選択できます。また、1つ以上の条件を満たす、または満たさない DataFrame
から行を取得することもできます。これは、boolean indexing
、positional indexing
、label indexing
、および query()
メソッドを使用して実行できます。
特定の列の値に基づいて Pandas 行を選択する
列の特定の値を含む、または含まない DataFrame から Pandas 行を選択できます。
特定の列の値を含む Pandas 行を選択する
ブールインデックスを使用してフィルタリングする
ブールインデックスでは、最初に、列に特定の要素が含まれているかどうかを表す一連のブール値であるマスクを生成します。
df_mask = df["col_name"] == "specific_value"
次に、このマスクを元の DataFrame に適用して、必要な値をフィルター処理します。
filtered_df = df[df_mask]
これは、列 col_name
に specific_value
を持つ行のみを含むフィルターされた DataFrame を返します。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] == 300
filtered_df = df[df_mask]
print(filtered_df)
出力:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
これは、Sales
の値が 300
である df
のすべての行を示します。
位置インデックスを使用してフィルタリングする
これはブール索引付けに似ていますが、1つの追加ステップが含まれます。この方法では、最初にブールマスクを作成し、次にブールマスクが True
値を持つ位置を見つけます。次に、マスク内の True
値を持つすべての位置を iloc()
メソッドに渡し、必要なすべての行のみが選択されるようにします。
import pandas as pd
import numpy as np
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] == 300
positions = np.flatnonzero(df_mask)
filtered_df = df.iloc[positions]
print(filtered_df)
出力:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
これはまた、Sales
値が 300
である df
のすべての行を提供します。
Pandas の連鎖
Pandas Chaining を使用して、列の値で Pandas DataFrame フィルターをフィルター処理することもできます。このメソッドでは、pandas.DataFrame.eq()
メソッド。DataFrame
の要素ごとの同等性を比較するために値がチェックされる DataFrame 列のメソッドです。
import pandas as pd
import numpy as np
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
filtered_df = df[df.Sales.eq(300)]
print(filtered_df)
出力:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
pandas.DataFrame.query()
pandas.DataFrame.query()
を使用して、列値で行を選択することができます。
import pandas as pd
import numpy as np
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
filtered_df = df.query("Sales == 300")
print(filtered_df)
出力:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
既存の DataFrame を更新する場合は、クエリメソッドで inplace=True
を設定できます。
特定の列の値を含まない Pandas 行を選択する
特定の列値を含まない Pandas 行を選択する方法は、特定の列値を持つ Pandas 行を選択する方法と似ています。変更する必要があるのは、マスクまたはクエリを作成するときに ==
を !=
に置き換えるだけで、列に特定の値が含まれないという条件だけです。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] != 300
filtered_df = df[df_mask]
print(filtered_df)
出力:
Date Sales Price
0 April-10 200 3
2 April-12 400 2
3 April-13 200 4
これにより、Sales
の値が 300
ではない df
のすべての行が選択されます。
列の値が特定の値より大きいか小さい Pandas 行を選択する
特定の値より大きいまたは小さい列値を持つ Pandas 行を選択するには、マスクまたはクエリを作成するときに、>
、<=
、>=
などの演算子を使用します。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] >= 300
filtered_df = df[df_mask]
print(filtered_df)
出力:
Date Sales Price
1 April-11 300 1
2 April-12 400 2
4 April-14 300 3
5 April-16 300 2
この結果、DataFrame の値は Sales
が 300
以上になります。
複数の列の値に基づいて Pandas 行を選択する
DataFrame の列の特定の値に基づいて行を選択するメソッドを導入しました。このセクションでは、複数の列の値に基づいて Pandas の行を選択する方法について説明します。
複数の列値のいずれかを含む Pandas 行を選択する
複数の列値のいずれか 1つを含む Pandas 行を選択するには、pandas.DataFrame.isin(values)
は、DataFrame の各要素が値に含まれているかどうかを示すブール値の DataFrame を返します。このようにして取得したブール値の DataFrame を使用して行を選択できます。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
values = [200, 400]
filtered_df = df[df.Sales.isin(values)]
print(filtered_df)
出力:
Date Sales Price
0 April-10 200 3
2 April-12 400 2
3 April-13 200 4
Sales
値が 200
または 400
のいずれかである DataFrame からのすべての行をフィルタリングします。
指定された複数の列値のいずれも含まない Pandas 行を選択する
指定された複数の列値のいずれも含まない DataFrame の行を選択するには、pandas.DataFrame.isin(values)
から返されたブーリアンの DataFrame を、先頭に ~
符号を付けて否定します。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
values = [200, 400]
filtered_df = df[~df.Sales.isin(values)]
print(filtered_df)
出力:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
Sales
値が 200
でも 400
でもない DataFrame からのすべての行をフィルタリングします。
複数の条件を持つ DataFrame 行を選択
複数の列の行の値を考慮して行をフィルタリングする場合は、複数の条件を作成し、それらを&
演算子で結合します。これで、行は、すべての列の条件を満たす場合にのみ選択されます。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
values_1 = [200, 400]
values_2 = [2, 3]
filtered_df = df[df.Sales.isin(values_1) & ~df.Price.isin(values_2)]
print(filtered_df)
出力:
Date Sales Price
3 April-13 200 4
Sales
値が 200
または 400
で、Price
値が 2 でも 3 でもない DataFrame からのすべての行をフィルターします。出力の行は、DataFrame 全体で両方の条件を満たすだけです。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn関連記事 - Pandas DataFrame
- Pandas DataFrame の列ヘッダーをリストとして取得する方法
- Pandas DataFrame 列を削除する方法
- Pandas で DataFrame 列を日時に変換する方法
- Pandas DataFrame で浮動小数点数 float を整数 int に変換する方法
- Pandas DataFrame を 1つの列の値で並べ替える方法
- Pandas group-by と Sum の集計を取得する方法