2017-10-08 5 views
0

私は2つのパンダのデータフレームがあります。Pythonで複数の列を別のデータフレームの1つの列に一致させることによって、データフレーム内のターゲット列の一部の値を更新するにはどうすればよいですか?

  • DF1
  • DF2

DF1は次のようになります。

a  f1  f2  f3  target 
1  aa  bb  cc  NaN 
2  xx  yy  zz  NaN 
more rows.... 

DF2は次のようになります

b  f1  target 
3  bb  450 
4  xx  220 
more rows.... 

DF1ための所望の出力は、これでは:

私はdf1["f1"]またはdf2["f1"]を照合することによってdf2["target"]から値をdf1["target"]を更新するにはどうすればよい:

a  f1  f2  f3  target 
1  aa  bb  cc  450 
2  xx  yy  zz  220 
more rows.... 

これが私の質問ですdf1["f2"]またはdf1["f3"]

複数の列に一致する必要があるため、マージ機能と更新機能が機能しません。私が見た他の解決策は、すべての複数の列を一致させることでしたが、これは私のデータにとっては当てはまりません。 (私は1つの列をのANY複数の列に一致させるだけでよい)

ありがとう。

答えて

0

一つのアプローチは、辞書を作成して、第二等可能であれば、可能であれば最初の列に適用することであろう

d = dict(zip(df2.f1.values,df2.target.values)) 
df1.target = df1.apply(lambda r: d.get(r['f1'],d.get(r['f2'],d.get(r['f3']))), axis=1) 
0

反復元にマージ付加データフレームにマージ検討:

# PAIRWISE MERGE FIELDS 
merge_cols = [[i, 'f1'] for i in list(df1.columns[1:len(df1.columns)-1])] 
# LIST OF INNER JOIN MERGES 
dfs = [pd.merge(df1, df2, left_on=m[0], right_on=m[1], how='inner') for m in merge_cols] 

# APPEND DFS 
stackdf = pd.concat(dfs)[['a','target_y']] 
finaldf = stackdf.merge(df1, on='a')\ 
       .assign(target=stackdf['target_y'].values)\ 
       .drop(['target_y'], axis=1) 

print(finaldf) 
# a f1 f2 f3 target 
# 0 2 xx yy zz  220 
# 1 1 aa bb cc  450 
関連する問題