【问题标题】:pandas: merging dataframes with different keyspandas:合并具有不同键的数据框
【发布时间】:2018-08-06 11:02:51
【问题描述】:

df1

  1      2  3   4
  101    1  C   22.6253
  101    2  O  -32.7148
  101    3  N  119.0569
  101    4  H   26.8502
  101    5  C  126.1352

df2

   num1      type   name   num2  first
   101        N     VAL     101  N
   101        H     VAL     101  H
   101       CA     VAL     101  C
   101       HA     VAL     101  H

我想将两者合并并获得以下输出 - 将 df2 中的 first 与 df1 中的 3 匹配:

结果

  1      2  3   4        type  name
  101    1  C   22.6253  NAN   NAN
  101    2  O  -32.7148  NAN   NAN
  101    3  N  119.0569   N    VAL
  101    4  H   26.8502   H    VAL
  101    5  C  126.1352  CA    VAL

我正在使用:

merge = df1.merge(df2, left_on='3', right_on='first', how='outer')

成功匹配 3 和第一个,但它不是按顺序进行的,只是重复所有其他列中的值。为什么会这样,我该如何解决?

     1    2  3         4  num1  type name  num2 first
   101    1  C   22.6253   101    CA  VAL   101     C
   101    1  C   22.6253   101    CB  VAL   101     C
   101    1  C   22.6253   101   CG1  VAL   101     C
   101    1  C   22.6253   101   CG2  VAL   101     C
   101    1  C   22.6253   101     C  VAL   101     C
   101    1  C   22.6253   102    CA  SER   102     C

【问题讨论】:

  • 在您的结果表中,这是如何出现的 101 1 C 22.6253 NAN NAN ?无法理解这种行为。
  • 类型列中的“CG1”值从何而来?在您的输入中没有提到任何地方

标签: python pandas merge


【解决方案1】:

这是一种方式。 我假设您的结果中的第一行不正确。

pd.merge(df1, df2[['type', 'name', 'first']]\
  .drop_duplicates('first'), how='left', left_on='3', right_on='first')\
  .drop('first', 1)

结果

     1  2  3         4 type name
0  101  1  C   22.6253   CA  VAL
1  101  2  O  -32.7148  NaN  NaN
2  101  3  N  119.0569    N  VAL
3  101  4  H   26.8502    H  VAL
4  101  5  C  126.1352   CA  VAL

说明

  • 您需要一个left 合并来维护df1 的结构,并且只添加来自df2 的数据。
  • drop_duplicates('first') on df2 确保您不会从 df2 中的重复中获得重复的行。请注意,first 中的每次出现仅保留第一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多