问题描述
我正在处理两个具有不同列名和维度的数据框。
第一个数据框“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