Pandas df.replace() 関数
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)
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
コードの解説:
- DataFrame内に「技术」部門が2行あります。
- を使用して
df.replace('技术', '研发')すべての「技术」を「研发」に置き換えます。 - この方法は、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)
# 置換が必要なデータを含む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)
# 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)
# 正規表現で処理する必要がある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)
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)
# 異常値を含む 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パラメータを使用します。- 正規表現を使用する際は、正規表現の構文が正しいことを確認してください。複雑な正規表現は予期しない結果を引き起こす可能性があります。
- 置き換え操作は値のマッチングに基づいており、データの型は変更されません。
- 大文字と小文字を区別してください。「技術」と「技術」は異なる値です。
- データを置き換える前に、比較や追跡ができるように元のデータをバックアップしておくことをお勧めします。
その他の拡張