2017-07-27 9 views
0

辞書に基づいてデータフレームの列の値を更新するにはどうすればよいですか?.locと.replace()を併用する

例えば、私がどのように見えるDFがあります。このGIV df = pd.DataFrame({'B' : [100,101,102,103],'E' : pd.Categorical(["test","train","test","train"]), 'F' : [128,300,1205,2000]})

Out[28]:

 B  E  F 
0 100 test 128 
1 101 train 300 
2 102 test 1205 
3 103 train 2000 

dict = {300:301, 2000:2001}

df.loc[df['B'].isin([101,103])].replace(dict)

Out[31]: 
    B  E  F 
1 101 train 301 
3 103 train 2001 

を適切な結果が得られますが、これを実行するとCopy Warningが発生し、元のデータフレームをこのロジックで更新する必要があります。

また、非常に非効率的に行うと、コンボは機能しますが、明らかに最適ではありません。

どうすればこの問題を解決できますか?

答えて

2

あなたは戻って、データフレームの同じ位置に結果を割り当てることができます。

d = {300:301, 2000:2001} 
mask = df.B.isin([101, 103]) 
df.loc[mask] = df.loc[mask].replace(d) 

df 
#  B  E  F 
#0 100 test 128 
#1 101 train 301 
#2 102 test 1205 
#3 103 train 2001 

それとも、update使用することができます。

df.update(df.loc[df.B.isin([101, 103])].replace(d)) 
+0

おかげで、私の前にupdate' '使用されることはありません。また、私はちょうど 'replace'がどのカラムをどのように動作させるかを知っていますか?それは明示的に言われていません.....それは単にdfのすべての価値に適用されますか?もしそうなら、場合によっては特定の列にのみ適用する方法がありますか? – guy

+0

'df.update(df.loc [mask、cols] .replace(d))'や 'df.loc [mask、cols]のように、サブセット化のために' loc'に列名を追加し、 = df.loc [mask、cols] .replace(d) 'cols'は列名のリストであると仮定します。例えば' cols = ['F'] 'です。 – Psidom

+0

ありがとう、あなたのソリューションは私の整数を浮動小数点に変換します。 – guy

関連する問題