Pandas の特定の条件に基づいて DataFrame 列を作成する方法

Suraj Joshi 2023年1月30日
  1. Pandas の特定の条件に基づいて新しい DataFrame 列を作成するためのリスト内包表記
  2. Pandas の特定の条件に基づいて新しい DataFrame 列を作成する NumPy メソッド
  3. Pandas の特定の条件に基づいて新しい DataFrame 列を作成する pandas.DataFrame.apply
  4. Pandas の特定の条件に基づいて新しい DataFrame 列を作成する pandas.Series.map()
Pandas の特定の条件に基づいて DataFrame 列を作成する方法

DataFrame オブジェクトのリスト内包表記、NumPy メソッド、apply() メソッド、および map() メソッドを使用して、Pandas の特定の条件に基づいて DataFrame 列を作成できます。

Pandas の特定の条件に基づいて新しい DataFrame 列を作成するためのリスト内包表記

さまざまなリスト内包表記を利用して、Pandas の特定の条件に基づいて新しい DataFrame 列を作成できます。リスト内包は、反復可能オブジェクトから新しいリストを作成する方法です。他の方法よりも非常に高速で簡単です。

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)
df["Status"] = ["Senior" if s >= 400 else "Junior" for s in df["Salary"]]
print(df)

出力:

      Name Joined date  Salary  Status
0   Hisila  2019-11-20     200  Junior
1  Shristi  2020-01-02     400  Senior
2    Zeppy  2020-02-05     300  Junior
3    Alina  2020-03-10     500  Senior
4    Jerry  2020-04-16     600  Senior
5    Kevin  2020-05-01     300  Junior

給与が 400 以上の場合は Senior、それ以外の場合は Junior の値を持つ df に新しい列 Status を作成します。

Pandas の特定の条件に基づいて新しい DataFrame 列を作成する NumPy メソッド

NumPy メソッドを使用して、Pandas の特定の条件に基づいて DataFrame 列を作成することもできます。この目的のために、np.where() メソッドと np.select() メソッドを利用できます。

np.where() メソッド

np.where() は条件を入力として受け取り、指定された条件を満たす要素のインデックスを返します。条件が 1つしかない場合、このメソッドを使用して、Pandas の特定の条件に基づいて DataFrame 列を作成できます。

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)

df["Status"] = np.where(df["Salary"] >= 400, "Senior", "Junior")
print(df)

出力:

      Name Joined date  Salary  Status
0   Hisila  2019-11-20     200  Junior
1  Shristi  2020-01-02     400  Senior
2    Zeppy  2020-02-05     300  Junior
3    Alina  2020-03-10     500  Senior
4    Jerry  2020-04-16     600  Senior
5    Kevin  2020-05-01     300  Junior

np.where(condition, x, y) は、条件が満たされた場合は x を返し、そうでない場合は y を返します。

上記のコードは、指定された条件が満たされた場合、値が Senior である新しい列 Statusdf に作成します。それ以外の場合、値はジュニアに設定されます。

np.select() メソッド

np.where() は、条件リストと選択リストを入力として受け取り、条件に応じて、選択リストの要素から構築された配列を返します。2つ以上の条件がある場合、このメソッドを使用して、Pandas の特定の条件に基づいて DataFrame 列を作成できます。

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)

conditionlist = [
    (df["Salary"] >= 500),
    (df["Salary"] >= 300) & (df["Salary"] < 300),
    (df["Salary"] <= 300),
]
choicelist = ["High", "Mid", "Low"]
df["Salary_Range"] = np.select(conditionlist, choicelist, default="Not Specified")

print(df)

出力:

         Name Joined date  Salary Salary_Range
0   Hisila  2019-11-20     200          Low
1  Shristi  2020-01-02     400        black
2    Zeppy  2020-02-05     300          Low
3    Alina  2020-03-10     500         High
4    Jerry  2020-04-16     600         High
5    Kevin  2020-05-01     300          Low

ここで、行の条件リストの 1 番目の条件が満たされている場合、その特定の行の Salary_Range 列の値が選択リストの 1 番目の要素に設定されます。conditionlist の他の条件も同様です。conditionlist のどの条件も満たされない場合、その行の列 Salary_Range の値は、np.where() メソッドの default パラメータの値に設定されます。たとえば、Not Specified

Pandas の特定の条件に基づいて新しい DataFrame 列を作成する pandas.DataFrame.apply

pandas.DataFrame.apply は DataFrame を返します
DataFrame の特定の軸に沿って特定の関数を適用した結果として。

構文:

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)

func は適用される関数を表します。

axis は関数が適用される軸を表します。axis=1 または axis = 'columns'を使用して、各行に関数を適用できます。

このメソッドを使用して、条件を確認し、新しい列のすべての行の値を設定できます。

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)


def set_values(row, value):
    return value[row]


map_dictionary = {200: "Low", 300: "LOW", 400: "MID", 500: "HIGH", 600: "HIGH"}

df["Salary_Range"] = df["Salary"].apply(set_values, args=(map_dictionary,))

print(df)

出力:

      Name Joined date  Salary Salary_Range
0   Hisila  2019-11-20     200          Low
1  Shristi  2020-01-02     400          MID
2    Zeppy  2020-02-05     300          LOW
3    Alina  2020-03-10     500         HIGH
4    Jerry  2020-04-16     600         HIGH
5    Kevin  2020-05-01     300          LOW

ここでは、df.apply() を使用してすべての行に適用される関数 set_values() を定義します。関数は、その行の Salary 列の値に応じて、Salary_Range 列の各行の値を設定します。Salary 列の値が指定された行の Salary_Range 列の値が何になるかを知るために、map_dictionary を作成します。この方法は、新しい列に多数のオプションがある場合に、より高い柔軟性を提供します。

Pandas の特定の条件に基づいて新しい DataFrame 列を作成する pandas.Series.map()

pandas.Series.map() を使用して新しい DataFrame を作成することもできます Pandas の特定の条件に基づく列。このメソッドは Series に対して要素ごとに適用され、辞書、関数、または Series である可能性のある入力に基づいて、ある列から別の列に値をマッピングします。

import pandas as pd
import numpy as np

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)

map_dictionary = {200: "Low", 300: "LOW", 400: "MID", 500: "HIGH", 600: "HIGH"}

df["Salary_Range"] = df["Salary"].map(map_dictionary)

print(df)

出力:

      Name Joined date  Salary Salary_Range
0   Hisila  2019-11-20     200          Low
1  Shristi  2020-01-02     400          MID
2    Zeppy  2020-02-05     300          LOW
3    Alina  2020-03-10     500         HIGH
4    Jerry  2020-04-16     600         HIGH
5    Kevin  2020-05-01     300          LOW

新しい列 Salary_Range を作成し、map_dictionary のキーと値のペアに応じて列の各行の値を設定します。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

関連記事 - Pandas DataFrame Column

関連記事 - Pandas Condition