Объединение двух DataFrames без потери информации - PullRequest
0 голосов
/ 15 мая 2018

У меня есть два DataFrames, как здесь:

df1 =

sent  token   token2
 0     a        b
 0     a        c
 0     b        d
 1     g        h
 1     h        k
 1     h        i
 1     g        i
 1     g        k


df2 =

sent  token   token2  rel
 0     a        b      A
 1     g        h      B
 1     k        g      C

Теперь я хочу объединить эти два DataFrames в один, который должен выглядеть следующим образом:

df_new =

sent  token   token2   rel
 0     a        b       A
 0     a        c      NaN
 0     b        d      NaN    
 1     g        h       B
 1     h        k      NaN
 1     h        i      NaN
 1     g        i      NaN
 1     g        k       C

Однако объединение DataFrames, как это

df_new = df1.merge(df2, on=["sent","token","token2"], how="left")

Я получаю нужный вывод, кроме того, что токен ["rel"] неверен

df_new =

sent  token   token2   rel
 0     a        b       A
 0     a        c      NaN
 0     b        d      NaN    
 1     g        h       B
 1     h        k      NaN
 1     h        i      NaN
 1     g        i      NaN
 1     g        k      NaN

Это связано с порядком токена в df1.Поскольку значение в ["rel"] зависит от ["token1"] -> ["token2"], оно не может применить свое значение при изменении порядка.Есть ли способ сделать это в процессе слияния без создания новой версии df1?

Ответы [ 2 ]

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

Решение:

Мне пришлось включить все возможные комбинации token и token2 в первый DataFrame, поскольку результат rel зависит от правильного порядка двух значений. Значит, мой желаемый результат был неправильным с самого начала. Мне пришлось удалить эту строку при создании df1:

df1[['token','token2']]=np.sort(df1[['token','token2']],1)

Итак, я получаю нужную версию df1 для этой задачи.

df1 =

sent  token   token2
 0     a        b
 0     a        c
 0     a        d
 0     b        a
 0     b        c
 0     b        d
 ...
0 голосов
/ 15 мая 2018

Вы можете сделать с np.sort

df2[['token','token2']]=np.sort(df2[['token','token2']].values,axis = 1)
df1.merge(df2, on=["sent","token","token2"], how="left")
Out[398]: 
   sent token token2  rel
0     0     a      b    A
1     0     a      c  NaN
2     0     b      d  NaN
3     1     g      h    B
4     1     h      k  NaN
5     1     h      i  NaN
6     1     g      i  NaN
7     1     g      k    C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...