Проверка повторяющейся подстроки в кадре данных - PullRequest
0 голосов
/ 20 марта 2020

Предположим, у меня есть такой фрейм данных:

df = pd.DataFrame({'A': ["asdfg", "abcdef", "ababab", "ghhzgghz", "qwerty"], 'B': [1, 2, 3, 4, 5]})
df.head()

O / P:

A         B
asdfg     1
abcdef    2
ababab    3
ghhzgghz  4 
qwerty    5

Как мне go проверить и проверить, есть ли повторяющаяся подстрока / s в столбце A?

A         B    C
asdfg     1    False
abcdef    2    False
ababab    3    True (matches for ab)
ghhzgghz  4    True (matches for gh)
qwerty    5    False

Общий лог c для return s in (s + s)[1:-1], но я хочу, чтобы он был упорядочен для любого общего повторения подстроки в каждой из этих строк.

1 Ответ

1 голос
/ 20 марта 2020

Идея состоит в том, чтобы создать все возможные подстроки и затем подсчитать их как Counter с проверкой, если хотя бы один счет >1:

from collections import Counter

#modified https://stackoverflow.com/a/22470047/2901002
def test_substrings(input_string):
  length = len(input_string)
  s = [input_string[i:j+1] for i in range(length) for j in range(i,length)]
  return any(x > 1 for x in Counter(s).values())

Другое решение с простым способом изменения минимальной длины тестируемых строк:

from itertools import chain, combinations

#changed first word asdfg to asdfa
df = pd.DataFrame({'A': ["asdfa", "abcdef", "ababab", "ghhzgghz", "qwerty"],
                   'B': [1, 2, 3, 4, 5]})

def test_substrings(input_string, N):
  s = chain(*[combinations(input_string,x) for x in range(N,len(input_string)+1)])
  return any(x > 1 for x in Counter(s).values())

df['C'] = df['A'].apply(lambda x: test_substrings(x, 1))
df['D'] = df['A'].apply(lambda x: test_substrings(x, 2))
print (df)
          A  B      C      D
0     asdfa  1   True  False
1    abcdef  2  False  False
2    ababab  3   True   True
3  ghhzgghz  4   True   True
4    qwerty  5  False  False
...