Соедините два фрейма данных со значениями двух столбцов одного df со значениями одного столбца другого фрейма данных.на каких условиях? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть такой фрейм данных:

df1
col1       col2      col3      col4
 1           2        A         S
 3           4        A         P
 5           6        B         R
 7           8        B         B

У меня есть другой фрейм данных:

df2
col5      col6         col3
 9         10           A
 11        12           R

Я хочу объединить эти два фрейма данных, если любое из значений col3 и col4df1 совпадает со значениями col3 df2, к которому он присоединится.

конечный кадр данных будет выглядеть следующим образом:

df3
col1    col2    col3    col5   col6
 1       2       A       9      10
 3       4       A       9      10
 5       6       R       11     12

Если значение col3 представлено в df2, то оно будет соединено через значения col3, иначе оно будет соединено через значения col4, если оно представлено в значениях col3df2

Как это сделать наиболее эффективно, используя pandas / python?

1 Ответ

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

Используйте double merge с внутренним соединением по умолчанию, для второй фильтрации строк, совпадающих с df3, последней concat вместе:

df3 = df1.drop('col4', axis=1).merge(df2, on='col3')
df4 = (df1.drop('col3', axis=1).rename(columns={'col4':'col3'})
            .merge(df2[~df2['col3'].isin(df1['col3'])], on='col3'))


df = pd.concat([df3, df4],ignore_index=True)
print (df)
   col1  col2 col3  col5  col6
0     1     2    A     9    10
1     3     4    A     9    10
2     5     6    R    11    12

РЕДАКТИРОВАТЬ: использовать левое соединение и последний combine_first:

df3 = df1.drop('col4', axis=1).merge(df2, on='col3', how='left')
df4 = (df1.drop('col3', axis=1).rename(columns={'col4':'col3'})
            .merge(df2, on='col3', how='left'))

df = df3.combine_first(df4)
print (df)
   col1  col2 col3  col5  col6
0     1     2    A   9.0  10.0
1     3     4    A   9.0  10.0
2     5     6    B  11.0  12.0
3     7     8    B   NaN   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...