2017-12-01 14 views
1

これは簡単なはずですが、それ以上の列を追加しなければ完了できません。私は以下のデータフレームdfを持っています:パンダのデータフレームで選択した行をマッピングする

Region ID Type Value 
A  2045 X 111 
A  2045 Y 222 
A  2045 Z 333 
B  2045 X NaN 
B  2045 Y NaN 
B  2045 Z NaN 

IDとタイプの連結からの値でNaNを記入しようとしています。領域Bの値のみが欠落しています。

は、次のことをしようとしました:

DF [ '検索'] =のDF [ 'ID'] + DFの[ 'タイプ'] < -----新しいルックアップ列を追加

df_map = DF [ < ----マッピング目的に有効な値を持つ別のdfを作成する

.map(df_map.set_index( 'Lookup ')[' Value '])< --- NaNをこのコードに置き換えるにはどうしたらいいですか?

事前に感謝します。

答えて

0

私はあなたがcombine_firstを必要とするためのマッピングによってNaN Sを交換すると思う:2列IDTypeによってMultiIndexjoin

df['Lookup'] = df['ID'].astype(str) + df['Type'] 
df_map= df.loc[df['Region']=='A', ['Value','Lookup']].set_index('Lookup')['Value'] 
print (df_map) 
Lookup 
2045X 111.0 
2045Y 222.0 
2045Z 333.0 
Name: Value, dtype: float64 

df['Value'] = df['Value'].combine_first(df['Lookup'].map(df_map)) 
print (df) 
    Region ID Type Value Lookup 
0  A 2045 X 111.0 2045X 
1  A 2045 Y 222.0 2045Y 
2  A 2045 Z 333.0 2045Z 
3  B 2045 X 111.0 2045X 
4  B 2045 Y 222.0 2045Y 
5  B 2045 Z 333.0 2045Z 

同じ溶液:

ちょうどアドオンに申し訳ありません
df_map= df.loc[df['Region']=='A', ['ID','Type','Value']].set_index(['ID','Type'])['Value'] 
print (df_map) 
ID Type 
2045 X  111.0 
     Y  222.0 
     Z  333.0 
Name: Value, dtype: float64 

new = df.join(df_map.rename('new'), on=['ID','Type'])['new'] 
df['Value'] = df['Value'].combine_first(new) 
print (df) 
    Region ID Type Value 
0  A 2045 X 111.0 
1  A 2045 Y 222.0 
2  A 2045 Z 333.0 
3  B 2045 X 111.0 
4  B 2045 Y 222.0 
5  B 2045 Z 333.0 
+0

を:どのような場合には地域の列はソートされていませんか?意味は、A、B、A、B、A、Bのいずれでもかまいません。 – WLC

+0

条件でフィルター列を 'df ['Region'] == 'A'' – jezrael

関連する問題