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