pandasのデータセット(データフレーム、シリーズ)において、値を置き換える場合、前回の記事で紹介したmapメソッドを使う方法もあるが、もっとシンプルで簡単な方法がある。

それが今回紹介するreplaceメソッドだ。

シリーズの値を置換する

例えば、以下のようなシリーズがあったとする。

import pandas as pd

series = pd.Series([1., 2., -1., 3., -1., 4])

# 0    1.0
# 1    2.0
# 2   -1.0
# 3    3.0
# 4   -1.0
# 5    4.0
# dtype: float64

データの中に負数が存在するが、これをpandasで欠損値として認識できるようNAに置き換えたい。

では用意したシリーズにreplaceメソッドを実行してみよう。

import numpy as np

series.replace(-1, np.nan, inplace=True)
# 0    1.0
# 1    2.0
# 2    NaN
# 3    3.0
# 4    NaN
# 5    4.0
# dtype: float64

replaceメソッドはデフォルトだと、値を置き換えたデータのコピーが作成されるが、上記例のとおりinplaceオプションにTrueを指定すると、元のオブジェクトが上書きされる。

複数の値を置換する

複数の値を置き換える場合は、第一引数にリストを渡す。

series.replace([-1, 1], np.nan, inplace=True)
# 0    NaN
# 1    2.0
# 2    NaN
# 3    3.0
# 4    NaN
# 5    4.0
# dtype: float64

また、値によって置き換える値を変えたい場合は、引数にディクショナリを渡せば良い。

rep = series.replace({-1: np.nan, 1: 10})
# 0    10.0
# 1     2.0
# 2     NaN
# 3     3.0
# 4     NaN
# 5     4.0
# dtype: float64

データフレームの値を置換する

データフレームに対してもreplaceメソッドを適用することが可能だ。

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Taro', 'Jiro', 'Saburo'],
                  'age': [20, 15, 0]})
#      name  age
# 0    Taro   20
# 1    Jiro   15
# 2  Saburo    0

rep = df.replace(0, np.nan)
#      name   age
# 0    Taro  20.0
# 1    Jiro  15.0
# 2  Saburo   NaN

シリーズ同様、デフォルトでは置換したデータのコピーが新たに作成される。

特定の列のみに置換を適用する

特定の列に置換を適用したい場合、データフレームのカラム名に対しreplaceメソッドを実行する。

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Taro', 'Jiro', 'Saburo'],
                  'age': [20, 15, 0],
                  'weight': [60, 0, 48]})
#      name  age  weight
# 0    Taro   20      60
# 1    Jiro   15       0
# 2  Saburo    0      48

rep = df.age.replace(0, np.nan)
# 0    20.0
# 1    15.0
# 2     NaN
# Name: age, dtype: float64

変数repに、指定した列に置換を適用した結果が代入された。

このrepを元のデータフレームに戻せば、特定の列のみに置換を適用したデータフレームを結果として得ることができる。

df['age'] = rep
#      name   age  weight
# 0    Taro  20.0      60
# 1    Jiro  15.0       0
# 2  Saburo   NaN      48