Поиск списка значений в серии Pandas и маскирование совпадений

#python #pandas

#python #панды

Вопрос:

Я пытаюсь найти список значений в серии Pandas и записать совпадения в новый столбец.

входные данные:

 vals = ['john', 'jane']

col1         
john doe
jane doe
billy j. 
 

желаемый результат:

 col1          col2
john doe      john
jane doe      jane
billy j.      nan
 

Я старался держаться подальше от циклов for и делать это с помощью методов Pandas, но не смог получить результат.

С помощью приведенного ниже голого кода python я могу распечатать совпадения, но не могу записать их в соответствующие строки в col2. Кроме того, это, очевидно, неэффективно для больших наборов данных.

 for i in vals:
    for j in df.col1:
        if i in j:
            print("matcht",  i,'in:t',j)
        else:
            print('-')

output:
match    john in:    john doe
-
-
-
match    jane in:    jane doe
-
 

Любая помощь будет признательна.

Комментарии:

1. И каков желаемый результат, если в строке несколько совпадений? например, col1, содержащий значение jane john doe

2. В идеале все совпадения с разделителем между ними.

Ответ №1:

Вот вариант, который также может обрабатывать несколько значений val в строке, объединяя их с помощью запятой:

 df['col2'] = df.col1.apply(lambda x: ','.join([v for v in vals if v in x])).replace('', np.nan)
 

Вывод:

        col1  col2
0  john doe  john
1  jane doe  jane
2  billy j.   NaN
 

Другой вариант с использованием pandas.Series.findall :

 pat = '|'.join(vals)
df['col2'] = df.col1.str.findall(pat).apply(','.join)