Python 创建具有最佳匹配查找的列

Python 创建具有最佳匹配查找的列,python,pandas,Python,Pandas,我试图找到一种有效的方法,在查找表中找到最佳匹配。所谓最佳匹配,我的意思是在查找表中为数据表中的值找到尽可能长的精确匹配 我的查找表包含值['A'、'A1'、'A12']。对于数据值['A','B','A1','A2','A12','A13','A123','A132'],结果应为['A','NaN','A1','A','A12','A1','A12','A1'] 下面的代码在上例中循环查找键1、2和3的所有可能长度,创建键_1作为列A的前n个字符,并在查找表中查找匹配项 这是可行的,但我相信有

我试图找到一种有效的方法,在查找表中找到最佳匹配。所谓最佳匹配,我的意思是在查找表中为数据表中的值找到尽可能长的精确匹配

我的查找表包含值['A'、'A1'、'A12']。对于数据值['A','B','A1','A2','A12','A13','A123','A132'],结果应为['A','NaN','A1','A','A12','A1','A12','A1']

下面的代码在上例中循环查找键1、2和3的所有可能长度,创建键_1作为列A的前n个字符,并在查找表中查找匹配项

这是可行的,但我相信有一个更优雅的解决方案

作为pd进口熊猫 lookup=pd.DataFrame{'Cat':['A','A1','A12']} 打印查找表:\n,查找,\n data=pd.DataFrame{'A':['A','B','A1','A2','A12','A13','A123','A132']} printData表:\n,数据,'\n--' key_length=lookup['Cat'].str.len.drop_duplicates.sort_values.values 键长度=[1] 对于键长中的c: 数据['key_1']=data['A'].str.0,c data=data.mergelookup,left_on=['key_1'],right_on=['Cat'],how='left' idx=数据['Cat']。不为空 data.loc[idx,'Category']=data.loc[idx,'Cat'] 数据。放置“Cat”,轴=1,在位=真 数据。删除“键1”,轴=1,位置=True 打印结果:\n,数据 代码的结果是

Lookup table: 
    Cat
0    A
1   A1
2  A12 

Data table: 
       A
0     A
1     B
2    A1
3    A2
4   A12
5   A13
6  A123
7  A132 
---
Result:
       A Category
0     A        A
1     B      NaN
2    A1       A1
3    A2        A
4   A12      A12
5   A13       A1
6  A123      A12
7  A132       A1

非常感谢你的帮助

您需要按len从最长到最短对查找值列表进行排序,并将其连接到字符串模式“A12 | A1 | a”。最后,在此模式上使用str.extract

l = ['A', 'A1', 'A12']
l = sorted(l, key=len, reverse=True)

Out[239]: ['A12', 'A1', 'A']

p = '('+'|'.join(l)+')'
data['Category'] = data['A'].str.extract(p)

Out[255]:
      A Category
0     A        A
1     B      NaN
2    A1       A1
3    A2        A
4   A12      A12
5   A13       A1
6  A123      A12
7  A132       A1