【问题标题】:Pandas Merge - put all join-column data under one output column instead of two?Pandas Merge - 将所有连接列数据放在一个输出列而不是两个输出列下?
【发布时间】:2016-08-25 18:41:42
【问题描述】:

我有两个 CSV 文件,具有以下架构:

CSV1 列:

"Id","First","Last","Email","Company"

CSV2 列:

"PersonId","FirstName","LastName","Em","FavoriteFood"

如果我将它们分别加载到 Pandas DataFrame 中并执行newdf = df1.merge(df2, how='outer', left_on=['Last', 'First'], right_on=['LastName','FirstName'])

然后,连接的 DataFrame 的 CSV 导出具有以下架构:

"Id","First","Last","Email","Company","PersonId","FirstName","LastName","Em","FavoriteFood"
  • 仅在 CSV1 中的所有行都有一个名字印在下面 “第一。”
  • 仅在 CSV2 中的所有行都有一个名字印在下面 “名字。”
  • 两个 CSV 文件中的所有行都有第一个 name (完全相同的值 - 这是意料之中的,因为它是 “加入”值) 打印在两列下。
  • “Last”和“LastName”的问题相同。

我想要的是一个更像这样的输出模式:

"Id","First","Last","Email","Company","PersonId","Em","FavoriteFood"
  • 它应该包含“First”列下的所有“名字”(以及“Last”的等价物)。

我熟悉的大多数关系数据库软件都这样做(左侧连接列名称赢得了命名之战)。 Pandas 是否有语法指示它这样做?

df1.merge(df2.rename(columns = {'LastName':'Last', 'FirstName':'First'}), how='outer', on=['Last', 'First']) 可以,但从风格上讲,在我的源代码中两次硬编码相同的列名会让我发疯。如果我更改 CSV 文件中的列名,则需要修复更多。

【问题讨论】:

    标签: python join merge rename


    【解决方案1】:

    一种方法是仅以相同的方式合并,但删除要删除的列。

    newdf.drop(['LastName','FirstName'], 1, inplace=True)
    

    【讨论】:

    • 这仍然需要在我的源代码中输入两次相同的列名,但这是我试图避免的。它只是在不同的线路上进行。 (另外,我的 IDE 没有启动并运行,但在我看来,它最终会让我在“First”下的数据中留下“仅存在于 df2”行中的漏洞。)
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2018-01-11
    • 2013-06-22
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多