我正在尝试寻找一种在查找表中找到最佳匹配项的有效方法。通过最佳匹配,我的意思是在查询表中找到数据表中值的尽可能长的精确匹配。
我的查询表包含值AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
。对于数据值为['A', 'A1', 'A12']
,结果应为['A', 'B', 'A1', 'A2', 'A12', 'A13', 'A123', 'A132']
。
以下代码循环遍历所有可能的查找键长度(在上例中为1、2和3),创建['A', NaN, 'A1', 'A', 'A12', 'A1', 'A12', 'A1']
作为列key_1
的前n个字符,并找到匹配项在A
表中。
它可以工作,但是我相信有一个更优雅的解决方案。
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)
非常感谢您的帮助!
答案 0 :(得分:1)
您需要按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