У меня к разным фреймам данных.Как найти совпадение и объединить фрейм данных - PullRequest
0 голосов
/ 14 мая 2018

У меня есть два разных фрейма данных, как показано

     df1
     ==================================                              
     KEYWORD                     TICKET
     Burst of bit errors          89814
     sync and stand-by reload     66246
     Port sub-modules modelling   70946
     wires stop passing traffic   60245
     Ignore Net flow              59052


     df2
     ==========================         
     TEXT_DATA
     Burst of bit errors due to
     stop passing traffic

, которые имеют частичное совпадение. Пожалуйста помоги мне с этим. вот кусок кода, который я разработал

import pandas as pd

Standard_Data = pd.read_excel('bOOK2.xlsx',usecols=[0,1])

print(Standard_Data)

     #Standard_Data
     ==================================                              
     KEYWORD                     TICKET
     Burst of bit errors          89814
     sync and stand-by reload     66246
     Port sub-modules modelling   70946
     wires stop passing traffic   60245
     Ignore Net flow              59052

keyword_data = Standard_Data['KEYWORD'].values.tolist()

input_data = pd.read_excel('book1.xlsx',usecols=[1])

print(input_data)

     input_data
     ==========================         
     TEXT_DATA
     Burst of bit errors due to
     stop passing traffic

#simply df1 = Standard_Data , df2 = input_Data
sentenced_data = input_data['Text_Data'].values.tolist()

df = pd.DataFrame({'sentenced_data':sentenced_data})

print(df)

df['MATCHED_KEYWORD'] = (df['sentenced_data'].apply(lambda x: [w for i in 
                                      keyword_data
                                      for w in i.split(' ')
                                      if w in (x)]))

df['KEYWORD'] = df['MATCHED_KEYWORD'].apply(','.join)

df['KEYWORD'] = df['KEYWORD'].str.replace(',',' ')

Z = Standard_Data.merge(df,on='KEYWORD',how='right')
print(Z)

Я получаю результат как

KEYWORD                 TICKET              sentenced_data

Burst of bit errors       NaN        Burst of bit errors due to   
stop passing traffic      NaN        stop passing traffic   

Но мой желаемый результат должен выглядеть следующим образом

KEYWORD                           sentenced_data               TICKET
Burst of bit errors               Burst of bit errors due to   89814
wires stop passing traffic        stop passing traffic         66246

Пожалуйста, помогите мне решить эту проблему

1 Ответ

0 голосов
/ 14 мая 2018

Попробуйте следующий код:

df - ваш первый кадр данных, df1 - второй

res = pd.DataFrame()
for text in df1.TEXT_DATA:
        res = res.append(
              df[df.apply(lambda row: row.KEYWORD in text or
                                    text in row.KEYWORD, axis=1)]
              )
print(res)

Вывод:

                      KEYWORD TICKET
0         Burst of bit errors  89814
3  wires stop passing traffic  60245


Здесьеще один способ сделать это, чтобы получить точно такой же, как и ожидаемый результат:
res = pd.DataFrame(columns=['KEYWORD', 'TICKET', 'sentenced_data']) # create an empty dataframe to store the answer
for text in df1.TEXT_DATA: # loop-through the second dataframe
    bools = df.apply(lambda row: row.KEYWORD in text or text in row.KEYWORD, axis=1) # return a boolean series if KEYWORD contains(by the "in" keyword in python) text or text contains KEYWORD
    if (bools.any()): # filter the df by the boolean series, append it to res, append the text to second column
        res = res.append(df[bools])
        res.iloc[-bools.sum():, 2] = text
res = res[['KEYWORD', 'sentenced_data', 'TICKET']]
print(res)

Вывод:

                      KEYWORD              sentenced_data TICKET
0         Burst of bit errors  Burst of bit errors due to  89814
3  wires stop passing traffic        stop passing traffic  60245


in ключевое слово в pythonвернет True, если два string частично совпадают или 100% совпадают;в противном случае возвращается False.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...