Переназначение строк с похожими (но немного отличающимися) подстроками к тому же результату - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующий кадр данных:

df = pd.DataFrame({
"group_code": ['111', '111', '111', '111', '111', '111', '111', '222', '222','222', '222', '222', '222'],
"ind_code": ['K M trading', 'K.M trad', 'KM trading LL', 'bill payment', 'pays', 'PayMent', 'Payer', 'Rev12','Rev11','13 rev','Rev13','Rev .!','REV 17']
})

Я хотел сгруппировать все значения в столбце: 'K M trading', 'K.M trad', 'KM trading LL' как "KM Trading".Может ли какое-то одно место помочь мне?

Я попробовал приведенный ниже код, но он не работает

 def replace_(row):
if 'pay' in row.lower():
    return 'Payment'
if 'rev' in row.lower():
    return 'Rev'
if 'km' in row.lower():
    return 'KM Trade'
else:
return row
df.ind_code = df.ind_code.apply(lambda row : replace_(row))
print(df)

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Используйте этот код, это может вам помочь.В этом коде используются приемы соответствия последовательности из "difflib".Для более подробной информации обратитесь к diffllib в документации пакета python.

import pandas as pd
import difflib

df = pd.DataFrame({
"group_code": ['111', '111', '111', '111', '111', '111', '111', '222', '222','222', '222', '222', '222'],
"ind_code": ['K M trading', 'K.M trad', 'KM trading LL', 'bill payment', 'pays', 'PayMent', 'Payer', 'Rev12','Rev11','13 rev','Rev13','Rev .!','REV 17']
})

a = "KM Trading"
ans = []
for val in df['ind_code']:
i = 0
seq=difflib.SequenceMatcher(None, a,val)
d = seq.ratio()*100
if d > 60:
ans.append(a)
else:
ans.append(val)

print (ans)
0 голосов
/ 20 декабря 2018

Ответ мести Орен великолепен, вот хакерское решение для ваших конкретных случаев (хотя и легко расширяемое):

for pair in [('km','KM Trading'), ('pay', 'Payment'), ('rev', 'Rev')]:
    df1.ind_code = df1.ind_code.apply(lambda x: pair[1] if pair[0] in re.sub('\.', '', x.lower()).strip() else x)
0 голосов
/ 20 декабря 2018

Вы можете построить отображение регулярных выражений и вызвать Series.replace со словарем.

mapping = {'pay' : 'Payment', 'rev' : 'Rev', 'km': 'KM Trading'}
for k, v in mapping.items():
    mapping['(?i).*' + r"\.?\s?".join(k) + '.*$'] = mapping.pop(k)

df.ind_code.replace(mapping, regex=True)

0     KM Trading
1     KM Trading
2     KM Trading
3        Payment
4        Payment
5        Payment
6        Payment
7            Rev
8            Rev
9            Rev
10           Rev
11           Rev
12           Rev
Name: ind_code, dtype: object

Где

print(mapping)

{'(?i).*k\\.?\\s?m.*$': 'KM Trading',
 '(?i).*p\\.?\\s?a\\.?\\s?y.*$': 'Payment',
 '(?i).*r\\.?\\s?e\\.?\\s?v.*$': 'Rev'}

Представляет замену без учета регистра с дополнительными точками и пробелами междусимволы для замены.

0 голосов
/ 20 декабря 2018

Вы можете попробовать использовать расстояние Левенштейна для вычисления расстояния между 2 словами.В основном это расстояние вычисляет минимальное количество односимвольных правок (вставок, удалений или подстановок), которые нужно получить из строки a в строку b

Например, у вас может быть ваша базовая строка 'km trading' и сравнение ее со всемидругие строки, и если расстояние ниже порогового значения, скажем, 4, то вы почти уверены, что строка является вариацией «торговли на км».

def minimumEditDistance(s1,s2):
    if len(s1) > len(s2):
        s1,s2 = s2,s1
    distances = range(len(s1) + 1)
    for index2,char2 in enumerate(s2):
        newDistances = [index2+1]
        for index1,char1 in enumerate(s1):
            if char1 == char2:
                newDistances.append(distances[index1])
            else:
                newDistances.append(1 + min((distances[index1],
                                             distances[index1+1],
                                             newDistances[-1])))
        distances = newDistances
    return distances[-1]

dist = minimumEditDistance('km trading', 'K.M trad'.lower())
print(dist)

этот код взят из Rosetta Code, алгоритм довольно сложныйчтобы понять из чистой интуиции, поэтому я рекомендую проверить некоторые учебники, которые подробно объясняют алгоритм.

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