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])
特にclip
はdf.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を組み合わせた方が、覚えることが少なくて良いかもしれません。