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

时间:2019-07-22 09:07:01

标签: python pandas

我正在尝试寻找一种在查找表中找到最佳匹配项的有效方法。通过最佳匹配,我的意思是在查询表中找到数据表中值的尽可能长的精确匹配。

我的查询表包含值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)

非常感谢您的帮助!

1 个答案:

答案 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