Pandas DataFrame の列値の置換

Mohamed Ayman 2023年10月10日
  1. pandas で列の値を置換するには map() メソッドを使用する
  2. Pandas で列値を置換するには loc メソッドを使用する
  3. Pandas の DataFrame で列の値を条件付きで置き換える
  4. replace() メソッドを使用して値を変更する
Pandas DataFrame の列値の置換

今回のチュートリアルでは、Pandas DataFrame で列値を置換する方法をご紹介します。今回は、列の値を簡単に置き換えるための 3つの関数を取り上げます。

pandas で列の値を置換するには map() メソッドを使用する

DataFrame のカラムは Pandas の Series です。列の各値を別の値に置き換えるには map メソッドを使用することができます。

Series.map() 構文

Series.map(arg, na_action=None)
  • パラメータ:
  1. arg: このパラメータは Series をマッピングするために使われます。これはコレクションでも関数でもよい。
  2. na_actionNaN (Not a Number) の値を扱うために使われます。値は Noneignore の 2つです。None がデフォルトで、map()Nan 値を含むすべての値にマッピングを適用し、ignoreNaN 値をマッピングメソッドに渡さずにそのままカラムに残します。

これは同じインデックスを持つ Series を返します。

それでは、map メソッドを実装する例を見てみましょう。以下の例では、同じ DataFrame を使用します。

import pandas as pd
import numpy as np

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "city": ["berlin", "paris", "roma", np.nan],
}
df = pd.DataFrame(data, columns=["name", "city"])

print(df)

出力:

      name    city
0  michael  berlin
1    louis   paris
2     jack    roma
3  jasmine     NaN

Pandas DataFrame で列の値をコレクションに置き換える

import pandas as pd
import numpy as np

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "city": ["berlin", "paris", "roma", np.nan],
}
df = pd.DataFrame(data, columns=["name", "city"])

# replace column values with collection

df["city"] = df["city"].map(
    {"berlin": "dubai", "paris": "moscow", "roma": "milan", np.nan: "NY"},
    na_action=None,
)

print(df)

出力:

      name    city
0  michael   dubai
1    louis  moscow
2     jack   milan
3  jasmine      NY

元の DataFrame city の列値は、map() メソッドの最初のパラメータとして辞書の新しい値に置き換えられます。

Pandas DataFrame の関数で列の値を置き換える

import pandas as pd
import numpy as np

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "city": ["berlin", "paris", "roma", np.nan],
}
df = pd.DataFrame(data, columns=["name", "city"])

# replace column values with function

df["city"] = df["city"].map("I am from {}".format)

print(df)

出力:

      name              city
0  michael  I am from berlin
1    louis   I am from paris
2     jack    I am from roma
3  jasmine     I am from nan

デフォルトでは na_actionNone になっているので、元のカラムの NaN も新しい文字列 I am from nan に置き換えられます。

置換されずに NaN を保持したい場合は、na_actionignore を設定することができます。

import pandas as pd
import numpy as np

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "city": ["berlin", "paris", "roma", np.nan],
}
df = pd.DataFrame(data, columns=["name", "city"])

# replace column values excluding NaN

df["city"] = df["city"].map("I am from {}".format, na_action="ignore")

print(df)

出力:

      name              city
0  michael  I am from berlin
1    louis   I am from paris
2     jack    I am from roma
3  jasmine               NaN

Pandas で列値を置換するには loc メソッドを使用する

Pandas DataFrame の列値を置き換えるもう一つの方法は、DataFrameloc() メソッドです。loc() メソッドはラベルから値にアクセスします。

DataFrame.loc[] 構文

pandas.DataFrame.loc[condition, column_label] = new_value
  • パラメータ
  1. condition: このパラメータは条件を真にする値を返します。
  2. column_label: このパラメータは更新対象のカラムを指定します。

パラメータで値を決定した後、new_value に更新します。

それでは、loc メソッドを実装する例を見てみましょう。以下の DataFrame を例にします。

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "grades": [30, 70, 40, 80],
    "result": ["N/A", "N/A", "N/A", "N/A"],
}

df = pd.DataFrame(data, columns=["name", "grades", "result"])

print(df)

出力:

      name  grades result
0  michael      30    N/A
1    louis      70    N/A
2     jack      40    N/A
3  jasmine      80    N/A

Pandas の DataFrame で列の値を条件付きで置き換える

ブーリアン条件を使って、対象となる要素を指定することができます。

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "grades": [30, 70, 40, 80],
    "result": ["N/A", "N/A", "N/A", "N/A"],
}

df = pd.DataFrame(data, columns=["name", "grades", "result"])

df.loc[df.grades > 50, "result"] = "success"

df.loc[df.grades < 50, "result"] = "fail"

print(df)

出力:

      name  grades   result
0  michael      30     fail
1    louis      70  success
2     jack      40     fail
3  jasmine      80  success

df.loc[df.grades>50, 'result']='success' は、grades 列値が 50 よりも大きい場合は sucess に置き換えます。

df.loc[df.grades<50,'result']='fail' は、grades 列値が 50 よりも小さければ fail に置き換えます。

replace() メソッドを使用して値を変更する

Pandas DataFrame の列値を置き換えるもう一つの方法は、Series.replace() メソッドです。

Series.replace() 構文

  • 1つの単一の値を置き換える
df[column_name].replace([old_value], new_value)
  • 複数の値を同じ値に置き換える
df[column_name].replace([old_value1, old_value2, old_value3], new_value)
  • 複数の値を複数の値に置き換える
df[column_name].replace(
    [old_value1, old_value2, old_value3], [new_value1, new_value2, new_value3]
)
  • DataFrame 全体の値を新しい値に置き換える
df.replace([old_value], new_value)

残りの例では、以下の DataFrame を使用します。

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "salary": [700, 800, 1000, 1200],
}

df = pd.DataFrame(data, columns=["name", "salary"])

print(df)

出力:

      name  salary
0  michael     700
1    louis     800
2     jack    1000
3  jasmine    1200

Pandas DataFrame で列の値を複数の値で置き換える

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "salary": [700, 800, 1000, 1200],
}

df = pd.DataFrame(data, columns=["name", "salary"])

df["name"] = df["name"].replace(["michael", "louis"], ["karl", "lionel"])

print(df)

出力:

      name  salary
0     karl     700
1   lionel     800
2     jack    1000
3  jasmine    1200

Pandas DataFrame で列の値を同じ値だけに置き換える

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "salary": [700, 800, 1000, 1200],
}

df = pd.DataFrame(data, columns=["name", "salary"])

df["salary"] = df["salary"].replace([1000, 1200], 1500)

print(df)

出力:

      name  salary
0     karl     700
1   lionel     800
2     jack    1500
3  jasmine    1500

Pandas DataFrame で列の値を 1つの値に置き換える

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "salary": [700, 800, 1000, 1200],
}

df = pd.DataFrame(data, columns=["name", "salary"])

df["salary"] = df["salary"].replace([700], 750)

print(df)

出力:

      name  salary
0     karl     750
1   lionel     800
2     jack    1000
3  jasmine    1200

Pandas DataFrame 全体の値を置き換える

import pandas as pd

data = {
    "name": ["michael", "louis", "jack", "jasmine"],
    "salary": [700, 800, 1000, 1000],
}

df = pd.DataFrame(data, columns=["name", "salary"])


df = df.replace([1000], 1400)

print(df)

出力:

      name  salary
0     karl     750
1   lionel     800
2     jack    1400
3  jasmine    1400

関連記事 - Pandas DataFrame