使用最佳匹配查找创建列

2024-05-16 12:30:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

import pandas as pd

lookup = pd.DataFrame({'Cat': ['A', 'A1', 'A12']} )
print("Lookup table: \n", lookup, "\n")
data = pd.DataFrame({'A': ['A', 'B', 'A1', 'A2', 'A12', 'A13', 'A123', 'A132']})
print("Data table: \n", data, '\n---')

key_lengths = lookup['Cat'].str.len().drop_duplicates().sort_values().values
#key_lengths = [1]
for c in key_lengths:
    data['key_1'] = data['A'].str.slice(0, c)
    data = data.merge(lookup, left_on=['key_1'], right_on=['Cat'], how='left')
    idx = data['Cat'].notnull()
    data.loc[idx, 'Category'] = data.loc[idx, 'Cat']
    data.drop('Cat', axis=1, inplace=True)


data.drop('key_1', axis=1, inplace=True)
print("Result:\n", data)

代码的结果是

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

非常感谢你的帮助


Tags: keya2dataa1tablelookupdropcat
1条回答
网友
1楼 · 发布于 2024-05-16 12:30:54

您需要按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

相关问题 更多 >