【问题标题】:Merging two DataFrames without losing information在不丢失信息的情况下合并两个 DataFrame
【发布时间】:2018-05-15 22:35:43
【问题描述】:

我有两个像这里这样的 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

但是像这样合并 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的新版本?

【问题讨论】:

  • 不,您必须对 df1 或 df2 进行某种操作才能获得所需的结果,merge 中没有参数可以让您更改合并键。
  • 是的,我必须改进我的 df1 以包含 token 和 token2 的所有可能组合。

标签: python pandas dataframe merge


【解决方案1】:

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

【讨论】:

  • 对不起,我应该对我的初始帖子更清楚。虽然此解决方案确实适用于这种情况,但它也不适用于订单正确的所有其他情况。它不依赖于字母顺序。
  • @ThelMi 其他情况在哪里?您应该将它们包括在您的问题中
【解决方案2】:

解决方案:

我必须在第一个 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
 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2017-04-30
    • 2012-04-14
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多