Извлекать общие слова между 2 столбцами в разных таблицах python - PullRequest
3 голосов
/ 07 мая 2020

Я хочу извлечь все слова в df1, которые соответствуют df2.

df1 = pd.DataFrame(['Dog has 4 legs.It has 2 eyes.','Fish has fins','Cat has paws.It eats fish','Monkey has tail'],columns=['Description'])

df2 = pd.DataFrame(['Fish','Legs','Eyes'],columns=['Parts'])


 Df1                                             Df2
|---------------------------------|             |---------------------------------|
|         **Description**         |             |          Parts                  |     
|---------------------------------|             |---------------------------------|
|  Dog has 4 legs.It has 2 eyes.  |             | Fish                            |
|---------------------------------|             |---------------------------------|
|  Fish has fins                  |             | Legs                            | 
|---------------------------------|             |---------------------------------|
|  Cat has paws.It eats fish.     |             | Tail                            |  
|---------------------------------|             |---------------------------------| 

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

|---------------------------------|-----------|
|         **Description**         |Parts      |
|---------------------------------|-----------|
|  Dog has 4 legs.It has 2 eyes.  |Legs,Tail  |
|---------------------------------|-----------|
|  Fish has fins                  |Fish       |   
|---------------------------------|-----------|
|  Cat has paws.It eats fish.     |Fish       | 
|---------------------------------|-----------|
|  Monkey has tail                |           |   
|---------------------------------|-----------|

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

IIU C str.extractall для сбора всех совпадений, затем groupby индекс для создания списка или агрегирования.

import re

pat = '|'.join(df2['Parts'].tolist())
#Fish|Legs|Eyes

df1['Parts'] = df1['Description'].str.extractall(f"({pat})"
                                  ,flags=re.IGNORECASE)\
                            .groupby(level=0)[0].agg(','.join)

print(df1)
                     Description      Parts
0  Dog has 4 legs.It has 2 eyes.  legs,eyes
1                  Fish has fins       Fish
2      Cat has paws.It eats fish       fish
3                Monkey has tail        NaN
1 голос
/ 07 мая 2020
Решение

@ Datanovice лучше, так как все в пределах Pandas. Это альтернатива, и она быстрее (манипуляции со строками в пределах Pandas не такие быстрые):

from itertools import product
from collections import defaultdict
res = df2.Parts.str.lower().array
d = defaultdict(list)
for description, word in product(df1.Description, res):
    if word in description.lower():
        d[description].append(word)

d

defaultdict(list,
            {'Dog has 4 legs.It has 2 eyes.': ['legs', 'eyes'],
             'Fish has fins': ['fish'],
             'Cat has paws.It eats fish': ['fish']})

df1['parts'] = df1.Description.map(d).str.join(',')
       Description                    parts
0   Dog has 4 legs.It has 2 eyes.   legs,eyes
1   Fish has fins                   fish
2   Cat has paws.It eats fish       fish
3   Monkey has tail 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...