Pandasで値の置き換えをしたい

Pandasでデータを加工する際、特定の条件で値を置き換えたい場合があります。その場合、使えるメソッドが多いので混乱するので整理しました。

範囲を指定して置き換える

whereとmaskはある境界条件を与えた場合、それを満たす、または満たさないと特定の値に置き換えます。(第二引数がない場合はnp.NaNで埋めます)

対してclipは最大値、最小値を与え、それよりも大きい、小さい場合はその値にします。

#10以上なら、10
df.mask(df>=10,10)

#逆で10を超えたものはそのまま
#それ以外は10
df.where(df>10,10)


#5以下は5,10以上は10
df.clip(5,10)

#列ごとに変えたい場合は列数の配列を渡します
#3列それぞれの条件
df.clip([5,3,2],[10,5,4])

特にclipdf.quantile(0.01)などの値を使うと外れ値の除去をすることができます。

値を指定して置き換える

もとの値や、置き換え位置、複数にするかなどによって、使うものが変わってきます。一番汎用性が高いのがreplaceですが、これはこれで与える型と形によって挙動が変わってきます。

#na関係を埋める
df.fillna(-9999)


#0,1,2を0にする
df.replace([0,1,2],0)

#1は0に,2は3にする
df.replace([1,2],[0,3])
df.replace({1:0,2:3})

#↑のA列のみ
df.replace(
  {
    "A":{1:0,2:3}
  }
)

#aはAにするが、それ以外はnanにする
df.map({"a","A"})

#formatにさしこみnanだったらnan
df.map("this is {}".format,na_action='ignore')

#正規表現を使う
df.replace(regex=[正規表現や置き換えたい文字], value='new')

#デフォルトで部分置き換え
df['co'].str.replace(置き換え文字,置き換え後)

#置き換えリストをつくって全部置き換え
words = []
df['col'].str.replace('|'.join(words), 置き換え後)



#前後のトリム処理
df['col'].str.strip(' ')

#分割したい場合
df['col'].str.split(pat='分割文字', expand=True)

#json文字列を展開したい場合
from pandas.io.json import json_normalize
import json 

json_normalize(
  df['col'].apply(lambda x: json.loads(x))
)

最悪、applyとlambdaを組み合わせた方が、覚えることが少なくて良いかもしれません。