2017-10-08 43 views
0

我有兩隻大熊貓dataframes:如何通過將其多列與python中另一個數據框中的一列進行匹配來更新數據框中的目標列的某些值?

  • 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所需的輸出是這樣的:

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

這是我的問題:

如何與值與df1["f1"]匹配df2["f1"]更新df1["target"]df2["target"]df1["f2"]df1["f3"]

合併和更新函數不適用於我,因爲我需要匹配多個列。我看到的其他解決方案也用於匹配所有多列,這不適用於我的數據。 (我只需要匹配一列與任意多列。)

謝謝。

回答

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 
相關問題