我试图找到一种有效的方法来找到一个查找表中的最佳匹配。所谓最佳匹配,我的意思是在查找表中为数据表中的值找到尽可能长的精确匹配
我的查找表包含值['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
非常感谢你的帮助
您需要按
len
从最长到最短对查找值列表进行排序,并将其连接到一个字符串模式'(A12|A1|A)'
。最后,在这个模式上使用str.extract
相关问题 更多 >
编程相关推荐