Проверьте, содержит ли столбец данных pandas подстроку для каждой строки другого столбца? - PullRequest
2 голосов
/ 14 января 2020

Я застрял на том, что изначально считал простой задачей, довольно давно. Здесь я буду использовать пример данных, так как фактические данные о проблемах намного более беспорядочные (и конфиденциальные). По сути, у меня есть два столбца, каждый из которых содержит строки. Я хочу проверить для каждой строки столбца 'substring', является ли она подстрокой какой-либо из строк столбца 'string':

s1 = ['good', 'how', 'hello', 'start']
s2 = ['exit', 'hello you','where are you', 'goodbye']
test = pd.DataFrame({'substring':s1, 'string':s2})
>>> test

    string           substring
0   exit             good
1   hello you        how
2   where are you    hello
3   goodbye          start

По сути, мне нужен индикатор для каждой строки, если столбец A если это подстрока в любом месте столбца B:

>>>test
    string           substring   C
0   exit             good        True
1   hello you        how         False
2   where are you    hello       True
3   goodbye          start       False

Я, кажется, перепробовал много вещей, и я только что потерял.

Я пытался перебирать строки:

sub_test = pd.DataFrame(columns=test.columns)

    for index, row in test.iterrows():
        a = row['substring']
        delta = test[test['string'].str.contains(a)]
        if len(delta.index > 1):
            sub_test = pd.concat([sub_test, delta]) 

Что дает мне некоторые пути и возвращает:

>>>sub_test

    string      substring
3   goodbye     start
1   hello you   how

Я думаю, что есть способ сделать это с помощью лямбды, но я не добился успеха:

test['C'] = test.apply(lambda row: row['substring'] in policies['substring'], axis = 1)

Любая помощь будет оценена. Спасибо

1 Ответ

1 голос
/ 14 января 2020

Сформируйте один большой шаблон, который мы используем для извлечения всех подстрок. Затем мы используем проверку isin, чтобы увидеть, соответствует ли substring где-либо.

p = '('+'|'.join(test.substring)+')'
test['C'] = test['substring'].isin(test['string'].str.extractall(p)[0].unique())

  substring          string      C
0      good            exit   True
1       how  hello good you  False
2     hello   where are you   True
3     start         goodbye  False

Это работает при str.extractall возврате DataFrame с совпадениями.

test['string'].str.extractall(p)

             0
  match       
1 0      hello
3 0       good

Индекс связан с индексом test, здесь не важно, с другой уровень, указывающий номер совпадения (так как мы используем .extractall). Значение - это подстрока, которая была сопоставлена. Поскольку наша группа захвата содержала определенные c слова (не общий шаблон), мы можем использовать проверку на равенство (isin), чтобы получить маску для значений 'substring'.

...