2017-04-19 18 views
1

私はDataframeの値を辞書からの値で置き換えたいと思います。 プレーン・イングリッシュ:Column Cにディクショナリ・キーと一致する値がある場合は、Column Dを、その特定のキーに対応するディクショナリの値に置き換えます。です除く辞書に基づくパンダの値を設定する

import pandas as pd 
import numpy as np 
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
print(dfp) 

z = {'rmacy': 999} 
dfp.loc[dfp['C'].isin(z.keys()), 'D' ] = z.values() # <--- code to change 

Output: 
    A B   C   D   E 
0 NaN 1.0 AA1233445  123456  Assign 
1 NaN 0.0  A9875  123456 Unassign 
2 3.0 3.0  rmacy  (999)  Assign #<--- Worked with paranthesis 
3 4.0 5.0 Idaho Rx 1.23457e+07  Ugly 
4 5.0 0.0 Ab123455  12345 Appreciate 
5 5.0 0.0 TV192837  12345  Undo 
6 3.0 NaN   RX 1.23457e+07  Assign 
7 1.0 9.0 Ohio Drugs 1.23457e+08 Unicycle 
8 5.0 0.0  RX12345 1.23457e+06  Assign 
9 NaN 0.0 USA Pharma   NaN  Unicorn 

上記のコードの作品は(Paranthesisに値を入れます。しかし、辞書が一つのキーよりも大きい場合の列の2つの試合があるので、それはColumn Dで両方の値を入れます。

 A B   C   D   E 
0 NaN 1.0 AA1233445  123456  Assign 
1 NaN 0.0  A9875  123456 Unassign 
2 3.0 3.0  rmacy (999, 333)  Assign 
3 4.0 5.0 Idaho Rx 1.23457e+07  Ugly 
4 5.0 0.0 Ab123455  12345 Appreciate 
5 5.0 0.0 TV192837  12345  Undo 
6 3.0 NaN   RX (999, 333)  Assign 
7 1.0 9.0 Ohio Drugs 1.23457e+08 Unicycle 
8 5.0 0.0  RX12345 1.23457e+06  Assign 
9 NaN 0.0 USA Pharma   NaN  Unicorn 
1は、これを解決する方法を

答えて

2

使用mapfillna

dfp.assign(D=dfp.C.map(z).fillna(dfp.D)) 

    A B   C   D   E 
0 NaN 1.0 AA1233445  123456.0  Assign 
1 NaN 0.0  A9875  123456.0 Unassign 
2 3.0 3.0  rmacy  999.0  Assign 
3 4.0 5.0 Idaho Rx 12345678.0  Ugly 
4 5.0 0.0 Ab123455  12345.0 Appreciate 
5 5.0 0.0 TV192837  12345.0  Undo 
6 3.0 NaN   RX 12345678.0  Assign 
7 1.0 9.0 Ohio Drugs 123456789.0 Unicycle 
8 5.0 0.0  RX12345 1234567.0  Assign 
9 NaN 0.0 USA Pharma   NaN  Unicorn 
+0

あなたは常に正しい答えを出す!ハハ。あなたは私のアプローチを歩いてもらえますか?どのように 'fillna()を使って'正しい結果が私の心を吹いているのですか? – MattR

+0

@MattR 'map'は辞書から値を返します。なければ' NaN'を返します。次に、それらの 'NaN'を' fillna(df.D) 'で埋めます。次に、現在の 'df.D'をこれらの新しい値で上書きします。 – piRSquared

+0

単に素晴らしいです...私はいつかあなたのように流暢であることを願っています。乾杯! – MattR

関連する問題