比较具有不同列名的两个数据帧,并使用第二个数据帧中的列更新第一个数据帧

问题描述

我正在处理两个具有不同列名和维度的数据框。

一个数据框“df1”包含单列“名称”,其名称需要位于第二个数据框中。如果匹配,则需要返回 df2 第一列 df2[0] 中的值并将其添加到 result_df

第二个数据框“df2”有多个列并且没有标题。这包含所有可能的小名和全名。任何列都可以有需要匹配的“名称

目标:在“df2”中找到“df1”中的名称,如果匹配,则返回df2第一列的值并添加到df1的相应行中

df1

姓名
ab
亚历克斯
鲍勃
罗伯特
账单

df2

0 1 2 3
艾布拉姆 ab
罗伯特 抢劫 鲍勃 罗比
亚历山大 亚历克斯 al
威廉 账单

result_df

姓名 匹配名称
ab 艾布拉姆
亚历克斯 亚历山大
鲍勃 罗伯特
罗伯特 罗伯特
账单 威廉

到目前为止我写的代码出错了。我需要把它写成一个高效的代码,因为它将用 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()rename()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