データのクリーニング工程において、誤字の修正や表記揺れの統一、あるいは特定の数値を別の値に置き換えたい場面は頻繁に発生します。Pandasの replace() メソッドを使用することで、完全一致による置換だけでなく、正規表現を用いた柔軟なパターン置換も可能です。
本記事では、基本的な文字列置換から正規表現を使った高度な置換、および欠損値(NaN)の処理方法について解説します。
目次
実装サンプルコード
文房具店の在庫リストを題材に、以下の3つの置換処理を行います。
- 完全一致置換: 誤字(”Noteboook”)を修正。
- 正規表現置換: 商品コードの末尾(色情報)を削除してカテゴリ名に統一。
- 欠損値置換: 在庫数が不明(NaN)な箇所を 0 に設定。
import pandas as pd
import numpy as np
def replace_dataframe_values():
"""
Pandas DataFrame内の値をreplaceメソッドで置換する関数
"""
# 1. サンプルデータの作成
# 誤字や欠損値を含む文房具データ
inventory_data = {
"Item_Name": ["Pencill", "Noteboook", "Eraser_S", "Eraser_L", "Ruler"],
"Category_Code": ["Pen-01", "Note-A4", "Era-01", "Era-02", "Rul-X"],
"Stock": [150, 80, np.nan, 45, np.nan]
}
df = pd.DataFrame(inventory_data)
print("--- 元のデータセット ---")
print(df)
print("\n")
# 2. 完全一致による単純な置換
print("=== 1. 文字列の完全一致置換 ===")
# "Pencill" -> "Pencil", "Noteboook" -> "Notebook" に修正
# 辞書形式で渡すことで、複数の置換を一度に行えます
replacements = {
"Pencill": "Pencil",
"Noteboook": "Notebook"
}
# Item_Name列に対して置換を実行
# df全体のreplaceも可能ですが、列を指定すると誤爆を防げます
df["Item_Name"] = df["Item_Name"].replace(replacements)
print("--- 誤字修正後のItem_Name ---")
print(df["Item_Name"])
# 3. 正規表現(Regex)による置換
print("\n=== 2. 正規表現によるパターン置換 ===")
# Category_Code列で、ハイフン以降(枝番)を削除してカテゴリを統一したい
# パターン: "-.*" (ハイフンとそれに続く任意の文字) を空文字 "" に置換
# regex=True を指定することで正規表現モードになります
df["Category_Code"] = df["Category_Code"].replace(r"-.*", "", regex=True)
print("--- 統一後のCategory_Code ---")
print(df["Category_Code"])
# 4. 欠損値(NaN)や特定の数値の置換
print("\n=== 3. 欠損値や数値の置換 ===")
# np.nan (欠損値) を 0 に置換
# fillna(0) と同じ効果ですが、replaceは特定の値(例: -1や999)の置換にも使えます
df["Stock"] = df["Stock"].replace(np.nan, 0)
# 結果を見やすくするため整数型に変換
df["Stock"] = df["Stock"].astype(int)
print("--- 欠損値処理後のStock ---")
print(df["Stock"])
print("\n--- 最終的なDataFrame ---")
print(df)
if __name__ == "__main__":
replace_dataframe_values()
実行結果
--- 元のデータセット ---
Item_Name Category_Code Stock
0 Pencill Pen-01 150.0
1 Noteboook Note-A4 80.0
2 Eraser_S Era-01 NaN
3 Eraser_L Era-02 45.0
4 Ruler Rul-X NaN
=== 1. 文字列の完全一致置換 ===
--- 誤字修正後のItem_Name ---
0 Pencil
1 Notebook
2 Eraser_S
3 Eraser_L
4 Ruler
Name: Item_Name, dtype: object
=== 2. 正規表現によるパターン置換 ===
--- 統一後のCategory_Code ---
0 Pen
1 Note
2 Era
3 Era
4 Rul
Name: Category_Code, dtype: object
=== 3. 欠損値や数値の置換 ===
--- 欠損値処理後のStock ---
0 150
1 80
2 0
3 45
4 0
Name: Stock, dtype: int64
--- 最終的なDataFrame ---
Item_Name Category_Code Stock
0 Pencil Pen 150
1 Notebook Note 80
2 Eraser_S Era 0
3 Eraser_L Era 45
4 Ruler Rul 0
解説:正規表現置換の活用
regex=True を使用する正規表現置換は、データの表記揺れを吸収する際に非常に強力です。
- 部分一致の置換:
.*ggg.*のようにワイルドカードを使うことで、文字列の一部が含まれる要素全体を置換対象にできます。 - 不要文字の削除: サンプルコードのように、特定の記号以降を削除したり、数字だけを抽出したりする処理が可能です。
注意点
replace() は元のDataFrameを変更せず、新しいDataFrame(またはSeries)を返します。変更を反映させるには、df = df.replace(...) のように再代入するか、inplace=True 引数を使用する必要があります。
