Найти соответствие строки между двумя фреймами данных - PullRequest
0 голосов
/ 11 октября 2018

У меня есть DataFrame, как показано ниже.

DF1:

   A
Any Match
Credit
I need a debit card.
Logging
Awesome

У меня есть другой DataFrame, как показано ниже:

DF2:

          B
I did not find any match.
I want a credit card.
I need a debit card.
I do not know.
I am logging into credit portal.

Мне нужен вывод:

              B                           A
     I did not find any match.        Any Match
     I want a credit card.            Credit
     I need a debit card.             I need a debit card.
     I am logging into credit portal. logging,credit

Здесь, если фраза, присутствующая в DF1, содержится в любом тексте, присутствующем в DF2.Выведите o / p как текст и важную фразу.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Вы могли бы сделать что-то вроде этого.Сначала определите функцию поиска, которая соответствует «нормализованному» тексту, например, в нижнем регистре:

def lookup(x, values):
    for value in values:
        if value.lower() in x.lower():
            return value

Затем примените эту функцию к вашему DF2:

dfB['A'] = dfB['B'].apply(lambda x: lookup(x, dfA['A']))

, которая должна дать вам:

    B                           A
0   I did not find any match.   Any Match
1   I want a credit card.       Credit
2   I need a debit card.        Debit
3   I do not know.              None
0 голосов
/ 11 октября 2018

попробуйте

df1['B'] = float('nan')

pos = 0
for i in range(len(df1)):
    for j in range(len(df2)):
        if df1['A'][i].lower() in df2['B'][j].lower():
            df1['B'].iloc[pos] = df2['B'][j]
            pos+=1
            break

df1.dropna(axis=0)

вывод

                     A                          B
0            Any Match  I did not find any match.
1               Credit      I want a credit card.
2  I need a debit card       I need a debit card.
0 голосов
/ 11 октября 2018

Попробуйте Fuzzywuzzy:

import pandas as pd
from fuzzywuzzy import fuzz

matched_entities = []

for row in df1.index:
    name1 = vendor_df.get_value(row,"A")
    for columns in df2.index:
        name2=df2.get_value(columns,"B")
        matched_token=fuzz.partial_ratio(name1,name2)
        if matched_token> 80:
            matched_vendors.append([A,B])

df_partial_ratio = pd.DataFrame(columns=['A', 'B'], data=matched_entities)

В вашей БД, если fuzz.partial_ratio не работает, попробуйте fuzz.ratio или fuzz.token_sort_ratio.Эти два могут быть реализованы путем изменения одной строки кода выше с помощью следующих кодов:

matched_token=fuzz.ratio(name1,name2)

ИЛИ

matched_token=fuzz.token_sort_ratio(name1,name2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...