首页 > 解决方案 > 比较具有不同列名的两个数据框,并使用来自第二个数据框的列更新第一个数据框

问题描述

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

第一个数据帧“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]

'''

标签: pythonpandasdataframecompare

解决方案


尝试通过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

推荐阅读