Как объединить панд на строку содержит? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть 2 кадра данных, которые я хотел бы объединить в общий столбец.Однако столбец, в который я хотел бы объединить, не является одной и той же строкой, а строка из одного содержится в другом, как показано ниже:

import pandas as pd
df1 = pd.DataFrame({'column_a':['John','Michael','Dan','George', 'Adam'], 'column_common':['code','other','ome','no match','word']})

df2 = pd.DataFrame({'column_b':['Smith','Cohen','Moore','K', 'Faber'], 'column_common':['some string','other string','some code','this code','word']})

Результат, который я хотел бы получить из d1.merge(d2, ...), - этоследующее:

column_a  |  column_b
----------------------
John      |  Moore    <- merged on 'code' contained in 'some code' 
Michael   |  Cohen    <- merged on 'other' contained in 'other string'  
Dan       |  Smith    <- merged on 'ome' contained in 'some string'  
George    |  n/a
Adam      |  Faber    <- merged on 'word' contained in 'word'  

1 Ответ

0 голосов
/ 19 февраля 2019

Новый ответ

Вот один подход, основанный на pandas / numpy.

rhs = (df1.column_common
          .apply(lambda x: df2[df2.column_common.str.find(x).ge(0)]['column_b'])
          .bfill(axis=1)
          .iloc[:, 0])

(pd.concat([df1.column_a, rhs], axis=1, ignore_index=True)
 .rename(columns={0: 'column_a', 1: 'column_b'}))

  column_a column_b
0     John    Moore
1  Michael    Cohen
2      Dan    Smith
3   George      NaN
4     Adam    Faber

Старый ответ

Вот решение для поведения левого соединения, как в немне сохраняет значения column_a, которые не соответствуют значениям column_b.Это медленнее, чем вышеупомянутое решение numpy / pandas, потому что оно использует два вложенных цикла iterrows для построения списка python.

tups = [(a1, a2) for i, (a1, b1) in df1.iterrows() 
                 for j, (a2, b2) in df2.iterrows()
        if b1 in b2]

(pd.DataFrame(tups, columns=['column_a', 'column_b'])
   .drop_duplicates('column_a')
   .reset_index(drop=True))

  column_a column_b
0     John    Moore
1  Michael    Cohen
2      Dan    Smith
3     Adam    Faber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...