合并两个DataFrame而不会丢失信息

时间:2018-05-15 13:53:09

标签: python pandas dataframe merge

我有两个这样的DataFrame:

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

现在我想将这两个DataFrame合并为一个看起来像这样:

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

然而合并像这样的DataFrame

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 :(得分:2)

您可以使用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

答案 1 :(得分:1)

解决方案:

我必须在第一个DataFrame中包含tokentoken2的所有可能组合,因为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
 ...