Почему .str.contains () не находит здесь частичных совпадений? (Pandas dataframe) - PullRequest
0 голосов
/ 10 января 2019

Pandas dataframe "df1" имеет столбец ("Receiver") со строковыми значениями.

df1
    Receiver
44  BANK
106 restaurant
149 Tax office
63  house
55  car insurance

Я хочу просмотреть каждую строку этого столбца, проверить, соответствуют ли они значениям (в основном, поисковым запросам из одного или двух слов) в другом фрейме данных ("df2"), и вернуть заголовок соответствующего столбца в правильных строках. Я пытаюсь сделать это с помощью следующей функции:

df1.Receiver.apply(lambda x:
                               ''.join([i for i in df2.columns 
                               if df2.loc[:,i].str.contains(x).any()]) 
                               )

Проблема: Однако это работает только для значений в столбце df1 "Получатель", которые состоят из только одно слово (поэтому в этом случае работают "BANK", "restaurant" и "house").

Значения с двумя или более словами не работают (в данном случае «Налоговая инспекция» и «Страхование автомобиля»).

Разве str.contains () не должен также находить частичные совпадения? Как найти частичные совпадения также для значений в столбце «Получатель», которые содержат два или более слов?

edit: вот как выглядит df2, у него разные категории в качестве заголовков столбцов, а затем в каждом столбце есть поисковые термины в качестве значений

df2
    Banks    Restaurants   Car           House
0   BANK     restaurant    car           house
1   bank     mcdonalds     
2            Subway                 

Здесь вся проблема в одном изображении, вывод можно увидеть справа, а категорий «Автомобиль» и «Налоговая инспекция» не найдены, поскольку получатели «Страхование автомобиля» и «Налоговая инспекция» (столбец получателя в df1) только частичное совпадение с поисковыми терминами "автомобиль" и "Налог" (значения в столбцах df2 "Автомобиль" и "Налоговая служба"). enter image description here

1 Ответ

0 голосов
/ 11 января 2019

Вместо итерации строк данных вы можете итерировать столбцы с df2 и использовать регулярное выражение с pd.Series.str.contains:

df1 = pd.DataFrame({'Receiver': ['BANK', 'restaurant house', 'Tax office', 'mcdonalds car']})

df1['Receiver_new'] = ''
for col in df2:
    values = '|'.join(df2[col].dropna())
    bool_series = df1['Receiver'].str.contains(values)
    df1.loc[bool_series, 'Receiver_new'] += f'{col}|'

print(df1)

#            Receiver        Receiver_new
# 0              BANK              Banks|
# 1  restaurant house  Restaurants|House|
# 2        Tax office                    
# 3     mcdonalds car    Restaurants|Car|
...