python - Pandas 序列字符串匹配行并获得最佳匹配行 ID
问题描述
假设我们有以下 pandas 数据框
import pandas as pd
data_dic = {
"values": ['jk4', '293','814' ,'er b3', '1', " sas", '<', '37', '/',3, '5651 + sdfv 84083', '+', '814 gfj67 340f', "sas " ,'293', '<', 'df gfdh', ' .', ':9271', '1', '3-', '=', '5', '293', "sas "],
"rowNr": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
}
data = pd.DataFrame(data_dic)
给定一个特定的字符串,我们如何获得最匹配的行 ID?例如,假设输入字符串是:" sas 293 <"
那么输出 ID 将[13,14,15]
与此数据帧中的最佳匹配相对应。
示例 2:对于输入字符串"814 gfj67 340f "
,输出将是[12]
示例 3:对于输入字符串". :92711"
,输出将是[17,18,19]
解决方案
好吧,这是我的尝试。
我仅通过计算匹配字符来计算最强匹配,我继续所有可能的连接,并根据该分数选择最佳匹配。
import pandas as pd
from itertools import product
data_dic = {
"values": ['jk4', '293', '814', 'er b3', '1', " sas", '<', '37', '/', 3, '5651 + sdfv 84083', '+', '814 gfj67 340f',
"sas ", '293', '<', 'df gfdh', ' .', ':9271', '1', '3-', '=', '5', '293', "sas "],
"rowNr": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
}
data = pd.DataFrame(data_dic)
data['values'] = data['values'].astype(str)
all_index_pairs = [(j, i) for i in range(len(data)) for j in range(i)]
all_concats = [''.join(data.loc[[*range(*pair)]]['values'].values) for pair in all_index_pairs]
def calc_match(s1, s2):
return sum(1 for x, y in zip(s1.replace(' ', ''), s2.replace(' ', '')) if x == y)
def get_best_match(s):
best_pair = max(zip(all_index_pairs, all_concats), key=lambda x: calc_match(s, x[1]))[0]
return [*range(*best_pair)]
in1 = " sas 293 <"
in2 = "814 gfj67 340f "
in3 = ". :92711"
print(get_best_match(in1))
print(get_best_match(in2))
print(get_best_match(in3))
输出:
[13, 14, 15]
[12]
[17, 18, 19]
推荐阅读
- sql - SQL Server 为列中的每个不同值创建一个 ID
- python - 使用 pybind11 通过预先存在的嵌入式 python 解释器公开 C++ 功能
- javascript - 如何模拟长按或右键单击 Javascript
- c++ - 使用插入成员函数将范围插入空向量是否合法?
- file-upload - 如何设置 Jmeter 测试以获得一定的吞吐量?
- c# - 使用 Azure CosmosDB 的 Entity Framework Core 反复初始化
- python - 如何从包含浮点数的 python 中的两个列表中计算利润?
- multithreading - 同步:当所有其他线程都离开时唤醒一个线程
- python - 如何解决python中的循环导入问题?
- garbage-collection - 为什么标记压缩比标记复制慢?