python - 比较具有不同列名的两个数据框,并使用来自第二个数据框的列更新第一个数据框
问题描述
我正在研究两个具有不同列名和维度的数据框。
第一个数据帧“df1”包含单列“名称”,其名称需要位于第二个数据帧中。如果匹配,则需要返回 df2 第一列 df2[0] 的值并将其添加到 result_df
第二个数据框“df2”有多个列,没有标题。这包含所有可能的小名和全名。任何列都可以有需要匹配的“名称”
目标:在“df2”中找到“df1”中的名称,如果匹配,则从 df2 的第一列返回值并添加到 df1 的相应行中
df1
姓名 |
---|
抗体 |
亚历克斯 |
鲍勃 |
罗伯特 |
账单 |
df2
0 | 1 | 2 | 3 |
---|---|---|---|
亚伯兰 | 抗体 | ||
罗伯特 | 抢 | 鲍勃 | 罗比 |
亚历山大 | 亚历克斯 | 人 | |
威廉 | 账单 |
结果_df
姓名 | 匹配名称 |
---|---|
抗体 | 亚伯兰 |
亚历克斯 | 亚历山大 |
鲍勃 | 罗伯特 |
罗伯特 | 罗伯特 |
账单 | 威廉 |
到目前为止我编写的代码给出了错误。我需要将其编写为高效代码,因为它将使用 df2 检查 df1 中的数百万个条目:
''' result_df = process_name(df1, df2)
定义进程名称(df1,df2):
for elem in df2.values:
if elem in df1['name']:
df1["matched_name"] = df2[0]
'''
解决方案
尝试通过concat()
,merge()
和drop()
andrename()
方法reset_index()
:
df=(pd.concat((df1.merge(df2,left_on='name',right_on=x) for x in df2.columns))
.drop(['1','2','3'],1)
.rename(columns={'0':'matched_name'})
.reset_index(drop=True))
输出df
:
name matched_name
0 robert robert
1 ab abram
2 alex alexander
3 bill william
4 bob robert