【问题标题】:Merging on non-unique column - pandas python合并非唯一列-pandas python
【发布时间】:2018-06-27 00:33:57
【问题描述】:

我一直在尝试以与 Excel“vlookup”类似的方式将两个 DataFrames 合并在一起(dfdf_details),但得到了奇怪的结果。下面我展示了两个DataFrames的结构,为简单起见没有填充真实数据

df_details:

Abstract_Title  |  Abstract_URL  |  Session_No_v2  | Session_URL | Session_ID
  -------------------------------------------------------------------------
Abstract_Title1    Abstract_URL1         1          Session_URL1     12345
Abstract_Title2    Abstract_URL2         1          Session_URL1     12345
Abstract_Title3    Abstract_URL3         1          Session_URL1     12345
Abstract_Title4    Abstract_URL4         2          Session_URL2     22222 
Abstract_Title5    Abstract_URL5         2          Session_URL2     22222
Abstract_Title6    Abstract_URL6         3          Session_URL3     98765
Abstract_Title7    Abstract_URL7         3          Session_URL3     98765

df:

Session_Title   |   Session_URL   |   Sponsors   |    Type    |   Session_ID
    -------------------------------------------------------------------------------
Session_Title1     Session_URL1        x, y z     Paper             12345
Session_Title2     Session_URL2         x, y      Presentation      22222
Session_Title3     Session_URL3        a, b ,c    Presentation      98765
Session_Title4     Session_URL4          c        Talk              12121
Session_Title5     Session_URL5         a, x      Paper             33333

我想与Session_ID 合并,我希望最终的DataFrame 看起来像:

我已经尝试了以下脚本,它产生了一个DataFrame,它复制了(多次)某些行并做了一些奇怪的事情。例如,df_details 有 7,046 行,df 有 1,856 行 - 当我运行以下合并代码时,我的 final_df 会产生 21,148 行:

final_df = pd.merge(df_details, df, how = 'outer', on = 'Session_ID')

请帮忙!

【问题讨论】:

  • 使用 Session_ID 检查您的 df 是否包含重复项?
  • 它们确实包含重复 - 单个会话 ID 用于多个摘要。
  • 例如 df_details 包含 3 12345 和 df 包含 2 12345,合并后你会看到 6
  • 是的,我希望它被复制,因为其中一些对应的抽象信息是不同的。将其视为一个层次结构,其中会话是最高级别的,有些会话只有摘要,有些会话有多个。我有关于会议的信息和关于摘要的信息,我想将它们合并在一起。

标签: python python-3.x pandas join merge


【解决方案1】:

为了生成您的最终输出表,我使用了以下代码:

final_df = pd.merge(df_details, df[['Session_ID',
                                'Session_Title',
                                'Sponsors',
                                'Type']], left_on = ['Session_ID'], right_on = ['Session_ID'], how = 'outer')

【讨论】:

  • 谢谢 - 不幸的是,这仍然对我不起作用。它复制了一些输出...
  • 如果你能提供你的输出是什么样的,我可以稍后看看。因为在重新创建数据框后,上面的代码生成了您提到的确切输出表。另外,您对重复项有什么顾虑?我问的原因是因为 Session_ID 列似乎是多对一的关系(这可以解释您提到的表大小的较大增加)。
  • 我认为显示真实输出的最简单方法是提供我从网站上抓取并尝试合并的所有文件。不知道如何在 Stack Overflow 上做到这一点。我想我也可以在合并后删除重复项,方法是创建一个连接两个标识符的列以创建一个唯一的标识符...
  • 您不需要创建连接字段。两个表中的 Session_ID 应该完全相同。 IE。当两个表中的 12345 分别正确映射时,无需创建带有“12345_12345”的列。
  • 我这样做是因为 Session_ID 不是唯一的,而且每个 ID 的出现次数也不同。两个表中也不相等。如果在 Excel 中进行 vlookup 或索引/匹配,则有一个非常简单的手动解决方案。 Abstract_ID 是唯一的,但不适用于所有观察结果(有些是“空白”但仍有会话 ID)。在我连接两列以创建唯一 ID 后,它起作用了!
【解决方案2】:

使用“左”而不是“外”。

final_df = pd.merge(df_details, df[['Session_ID','Session_Title','Sponsors','Type']], left_on = ['Session_ID'], right_on =['Session_ID'], how = 'left')

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2012-01-15
    • 2015-05-30
    • 2014-10-03
    • 1970-01-01
    • 2023-03-27
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多