Pandas df.replace() 関数

Pandas のよく使う関数


df.replace()DataFrame内のデータを置換するためのPandasの関数です。

データの置換はデータクリーニングにおける一般的な操作であり、replace()特定の値を新しい値に置き換えることができ、単一値の置換、複数値の置換、正規表現による置換など、さまざまな柔軟な方法に対応しています。これは外れ値の処理、データ形式の統一、エンコーディング変換などの場面で非常に役立ちます。


基本構文とパラメータ

replace()DataFrameのメンバー関数であり、ドット演算子を.使用して呼び出します。

構文形式

DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')

パラメータの説明

パラメータ 型 必須かどうか 説明 デフォルト値
to_replace str, regex, list, dict, int, float, None 必須 置換する値。単一の値、値のリスト、辞書、正規表現などを指定できます。 None
value scalar, dict, list, str, regex, None 省略可能 置換後の値。もしto_replaceが辞書の場合、この項目は省略可能です。辞書でない場合は、この項目は必須です。 None
inplace bool 省略可能 もしTrueの場合、元のDataFrameを直接変更し、新しいオブジェクトを返しません。もしFalseの場合、新しいDataFrameを返し、元のデータは変更されません。 False
limit int 省略可能 置換の最大回数を指定します。 None
regex bool または str 省略可能 もしTrueの場合、to_replaceを正規表現として扱います。 False
method str 省略可能 当 to_replaceがリストの場合に使用します。'pad' 或 'ffill'前方充填を表します。'backfill' 或 'bfill'後方充填を表します。 'pad'

戻り値の説明

  • 新しいDataFrameを返します(もしinplace=Falseの場合)。または、None(もしinplace=True)。
  • の場合、返されるDataFrame内の指定された値は置換されています。

例

一連の例を通して、replace()の使い方を完全に理解しましょう。

例1:単一の値の置換

DataFrame内の特定の値を新しい値に置き換えます。

例

import pandas as pd
import numpy as np

# 重複データを含むDataFrameを作成する
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '部门': ['技术', '市场', '技术', '市场'],
    '薪资': [5000, 6000, 5500, 7000]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# '技术' を '研发' に置き換える
df_replaced = df.replace('技术', '研发')

print("置換後のデータ:")
print(df_replaced)

実行結果の予想:

原始数据:
    姓名  部门   薪资
0  张三  技术  5000
1  李四  市场  6000
2  王五  技术  5500
3  赵六  市场  7000
==================================================
替换后的数据:
    姓名   部门  薪资
0  张三  研发  5000
1  李四  市场  6000
2  王五  研发  5500
3  赵六  市场  7000

コードの解説:

  1. DataFrame内に「技术」部門が2行あります。
  2. を使用してdf.replace('技术', '研发')すべての「技术」を「研发」に置き換えます。
  3. この方法は、DataFrame内の一致するすべての値を置換します。

例2:複数の値の1対1置換

辞書を使用して、複数の異なる値を一度に置換します。

例

import pandas as pd

# 置換が必要なデータを含むDataFrameを作成する
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '城市': ['北京', '上海', '广州', '深圳'],
    '等级': ['A', 'B', 'A', 'C']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 辞書を使用して複数の置換を行う
replacements = {
    '北京': '北京市',
    '上海': '上海市',
    '广州': '广州市',
    '深圳': '深圳市',
    'A': '优秀',
    'B': '良好',
    'C': '及格'
}
df_replaced = df.replace(replacements)

print("置換後のデータ:")
print(df_replaced)

実行結果の予想:

原始数据:
    姓名  城市  等级
0  张三  北京   A
1  李四  上海   B
2  王五  广州   A
3  赵六  深圳   C
==================================================
替换后的数据:
    姓名   城市  等级
0  张三  北京市  优秀
1  李四  上海市  良好
2  王五  广州市  优秀
3  赵六  深圳市  及格

コードの解説:

  • 辞書を使用することで、replacements複数の置換ルールを一度に指定できます。
  • この方法は非常に効率的で、複数回の呼び出しを避けられます。replace()。

例3:特定の列の値を置換

他の列に影響を与えずに、特定の列の値だけを置換できます。

例

import pandas as pd

# DataFrameを作成する
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '部门': ['技术', '市场', '技术', '市场'],
    '职位': ['技术', '市场', '技术', '市场']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# '部门'列の'技术'のみを'研发'に置き換える
df_replaced = df.replace({'部门': '技术'}, '研发')

print("部門列のみを置き換えた後のデータ:")
print(df_replaced)
print("=" * 50)

# ネストされた辞書を使用して、列ごとに異なる置換ルールを適用することもできます
df_replaced2 = df.replace({'部门': {'技术': '研发', '市场': '销售'}, '职位': '技术'})

print("異なる列に異なるルールで置換した後のデータ:")
print(df_replaced2)

実行結果の予想:

原始数据:
    姓名  部门  职位
0  张三  技术  技术
1  李四  市场  市场
2  王五  技术  技术
3  赵六  市场  市场
==================================================
只替换部门列后的数据:
    姓名   部门  职位
0  张三  研发  技术
1  李四  市场  市场
2  王五  研发  技术
3  赵六  市场  市场
==================================================
对不同列使用不同规则替换后的数据:
    姓名   部门  职位
0  张三  研发  研发
1  李四  销售  市场
2  王五  研发  研发
3  赵六  销售  市场

コードの解説:

  • を使用すると{'部門': '技術'}'部门'列の値だけを置換できます。
  • ネストされた辞書は{'部門': {'技術': '開発'}}列ごとに異なる置換ルールを指定できます。

例4:正規表現を使用した置換

regex=Trueパラメータを使用すると、正規表現による置換が可能になり、パターンに一致するテキストを処理する際に非常に役立ちます。

例

import pandas as pd

# 正規表現で処理する必要があるDataFrameを作成する
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '电话': ['138-0000-0000', '139-1111-1111', '137-2222-2222', '136-3333-3333'],
    '备注': ['正常', 'VIP客户', '正常', 'VIP 客户']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 正規表現を使用して電話番号の区切り文字を置換する
df_replaced = df.replace(to_replace=r'(d{3})-(d{4})-(d{4})', value=r'1****3', regex=True)

print("電話番号を置換(中央4桁を非表示)した後のデータ:")
print(df_replaced)
print("=" * 50)

# 備考の'VIP客户'(スペースの違いがある可能性)を置換する
df_replaced2 = df.replace(to_replace=r'VIPs*客户?', value='VIP', regex=True)

print(VIP備考を統一した後のデータ:)
print(df_replaced2)

実行結果の予想:

原始数据:
    姓名          电话        备注
0  张三  138-0000-0000       正常
1  李四  139-1111-1111   VIP客户
2  王五  137-2222-2222       正常
3  赵六  136-3333-3333  VIP 客户
==================================================
替换电话号码(隐藏中间4位)后的数据:
    姓名          电话  备注
0  张三  138****0000   正常
1  李四  139****1111  VIP客户
2  王五  137****2222   正常
3  赵六  136****3333  VIP 客户
==================================================
统一VIP备注后的数据:
    姓名          电话  备注
0  张三  138-0000-0000  正常
1  李四  139-1111-1111  VIP
2  王五  137-2222-2222  正常
3  赵六  136-3333-3333  VIP

コードの解説:

  • 最初の例では正規表現(d{3})-(d{4})-(d{4})を使用して電話番号の形式に一致させ、次のように置換します。1****3中央4桁の数字を伏せます。
  • 2番目の例ではVIPs*客户?を使用して「VIP客户」と「VIP 客户」の2つの形式に一致させ、「VIP」に統一して置換します。

例5:欠損値NaNの置換

replace()を使用して欠損値NaNを置換することもできます。これはデータクリーニングにおける一般的な操作です。

例

import pandas as pd
import numpy as np

# 欠損値を含むDataFrameを作成する
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年齢': [25, np.nan, 35, np.nan],
    '給与': [5000, 6000, np.nan, 8000]
}
df = pd.DataFrame(data)

print("元のデータ:")
print(df)
print("=" * 50)

# NaN を 0 に置き換える
df_replaced = df.replace(np.nan, 0)

print("NaN を 0 に置き換えた後のデータ:")
print(df_replaced)
print("=" * 50)

# NaN を他の値(例:"未知")に置き換える
df_replaced2 = df.replace(np.nan, '未知')

print("NaN を「未知」に置き換えた後のデータ:")
print(df_replaced2)

実行結果の予想:

原始数据:
    姓名   年龄    薪资
0  张三  25.0  5000.0
1  李四   NaN  6000.0
2  王五  35.0     NaN
3  赵六   NaN  8000.0
==================================================
将 NaN 替换为 0 后的数据:
    姓名   年龄  薪资
0  张三  25.0  5000
1  李四   0.0  6000
2  王五  35.0     0
3  赵六   0.0  8000
==================================================
将 NaN 替换为'未知'后的数据:
    姓名   年龄    薪资
0  张三  25.0  5000.0
1  李四  未知  6000.0
2  王五  35.0    未知
3  赵六  未知  8000.0

コードの解説:

  • np.nan欠損値を表し、使用できますreplace(np.nan, value)で置き換えます。
  • データ型とビジネス要件に応じて、適切な値を選択して欠損値を置き換えます。

例6:数値の置換

数値型のデータを置き換えて、データの標準化や異常値処理を行うことができます。

例

import pandas as pd

# 異常値を含む DataFrame を作成する
data = {
    '学生': ['張三', '李四', '王五', '趙六', '銭七'],
    '成績': [85, 150, 78, 92, -10]  # 150 と -10 は異常値です
}
df = pd.DataFrame(data)

print("元のデータ:")
print(df)
print("=" * 50)

# 異常値を適切な範囲の値に置き換える
df_replaced = df.replace({150: 100, -10: 0})

print("異常値を置き換えた後のデータ:")
print(df_replaced)
print("=" * 50)

# 条件判定を使用して複数の値を置き換える
df_replaced2 = df.replace(to_replace=[150, -10], value=[100, 0])

print("リストを使用して複数の値を置き換える:")
print(df_replaced2)

実行結果の予想:

原始数据:
    学生  成绩
0  张三    85
1  李四   150
2  王五    78
3  赵六    92
4  钱七   -10
==================================================
将异常值替换后的数据:
    学生  成绩
0  张三    85
1  李四   100
2  王五    78
3  赵六    92
4  钱七     0
==================================================
使用列表替换多个值:
    学生  成绩
0  张三    85
1  李四   100
2  王五    78
3  赵六    92
4  钱七     0

コードの解説:

  • 辞書{150: 100, -10: 0}異常値の150を100に、-10を0に置き換えます。
  • リスト[150, -10]と[100, 0]置き換える値と置き換えた後の値をそれぞれ指定し、順番に対応させます。

注意事項

  • replace()デフォルトでは元の DataFrame は変更されません。元の場所で変更したい場合は、inplace=Trueパラメータを使用します。
  • 正規表現を使用する際は、正規表現の構文が正しいことを確認してください。複雑な正規表現は予期しない結果を引き起こす可能性があります。
  • 置き換え操作は値のマッチングに基づいており、データの型は変更されません。
  • 大文字と小文字を区別してください。「技術」と「技術」は異なる値です。
  • データを置き換える前に、比較や追跡ができるように元のデータをバックアップしておくことをお勧めします。

Pandas 常用関数

その他の拡張