Строки последовательности Панд совпадают по строкам и получают идентификаторы строк с наилучшим соответствием - PullRequest
1 голос
/ 11 июля 2019

Предположим, что у нас есть следующий кадр данных панд

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)

с учетом конкретной строки, как мы можем получить идентификаторы строк, которые лучше всего соответствуют? например, допустим, что входная строка была: " sas 293 <", тогда выходные идентификаторы были бы [13,14,15], что соответствует наилучшему совпадению в этом кадре данных.

Пример 2: для входной строки "814 gfj67 340f " вывод будет [12]

Пример 3: для входной строки ". :92711" результат будет [17,18,19]

Ответы [ 2 ]

1 голос
/ 11 июля 2019

ну, вот и моя попытка.

Я вычисляю самое сильное совпадение, просто посчитав соответствующие символы, Я делаю все возможные сочленения и выбираю лучшее, основываясь на этом счете.

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]
0 голосов
/ 11 июля 2019

Вот, пожалуйста:

= ^ .. ^ =

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]
}
df = pd.DataFrame(data_dic)


input_string = "sas 293"
split_string = input_string.split(' ')

for item in split_string:
    find_match = df['values'].str.match(item).fillna(False)
    index = df.index[find_match].tolist()
    print(index)

Выход:

[13, 24]
[1, 14, 23]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...