Pandas の列値に基づいて DataFrame 行をフィルタリングする方法

Suraj Joshi 2023年1月30日
  1. 特定の列の値に基づいて Pandas 行を選択する
  2. 特定の列の値を含まない Pandas 行を選択する
  3. 列の値が特定の値より大きいか小さい Pandas 行を選択する
  4. 複数の列の値に基づいて Pandas 行を選択する
  5. 複数の条件を持つ DataFrame 行を選択
Pandas の列値に基づいて DataFrame 行をフィルタリングする方法

1つまたは複数の列の値に基づいて、DataFrame の行を選択できます。また、1つ以上の条件を満たす、または満たさない DataFrame から行を取得することもできます。これは、boolean indexingpositional indexinglabel indexing、および query() メソッドを使用して実行できます。

特定の列の値に基づいて Pandas 行を選択する

列の特定の値を含む、または含まない DataFrame から Pandas 行を選択できます。

特定の列の値を含む Pandas 行を選択する

ブールインデックスを使用してフィルタリングする

ブールインデックスでは、最初に、列に特定の要素が含まれているかどうかを表す一連のブール値であるマスクを生成します。

df_mask = df["col_name"] == "specific_value"

次に、このマスクを元の DataFrame に適用して、必要な値をフィルター処理します。

filtered_df = df[df_mask]

これは、列 col_namespecific_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 の値は Sales300 以上になります。

複数の列の値に基づいて 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
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Pandas DataFrame

関連記事 - Pandas DataFrame Row