我有两个pandas数据帧:
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 多列匹配。)
感谢。
答案 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