如何通过将其多个列与python中另一个数据帧中的一列匹配来更新数据框中目标列的某些值?

时间:2017-10-08 07:57:12

标签: python pandas dataframe

我有两个pandas数据帧:

  • 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["target"]df2["target"] df2["f1"] 匹配来更新来自df1["f1"]的值的df1["f2"] df1["f3"]

合并和更新功能对我不起作用,因为我需要匹配多个列。我看到的其他解决方案也用于匹配所有多列,而我的数据则不然。 (我只需要将一列与 ANY 多列匹配。)

感谢。

2 个答案:

答案 0 :(得分: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)

答案 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