pandasのデータセット(データフレーム、シリーズ)において、値を置き換える場合、前回の記事で紹介したmapメソッドを使う方法もあるが、もっとシンプルで簡単な方法がある。
それが今回紹介するreplaceメソッドだ。
Contents
シリーズの値を置換する
例えば、以下のようなシリーズがあったとする。
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