【问题标题】:Python Pandas merge dataframes without duplicating columnsPython Pandas 合并数据框而不重复列
【发布时间】:2020-04-10 06:35:57
【问题描述】:

我正在尝试使用 pandas 合并两个或多个数据框:

DF1:

   Name     E-mail               Phone Number 
   Trent    trent@example.com    12341234
   Barry    barry@example.com    12345678
   Jared    jared@example.com    56781234

DF2:

   Name     E-mail               Age
   Trent    trent@example.com    24
   Barry    barry@example.com    18
   Jared    jared@example.com    31

代码:

df1 = pd.read_excel("Book1.xlsx")
df2 = pd.read_excel("Book2.xlsx")
files = [df1,df2]

df_all = reduce(lambda left,right: pd.merge(left, right, on='Name'), files)
df_all = df_all.drop_duplicates(subset='Name', keep='first')
df_all = df_all.fillna(0)

现在的输出是:

   Name     E-mail_x               Age   E-mail_y             Phone Number
   Trent    trent@example.com      24    trent@example.com    12341234
   Barry    barry@example.com      18    barry@example.com    12345678
   Jared    jared@example.com      31    jared@example.com    56781234

无论如何要删除“_x”和“_y”并使其只是一列

预期输出:

   Name     E-mail                Age      Phone Number
   Trent    trent@example.com      24        12341234
   Barry    barry@example.com      18        12345678
   Jared    jared@example.com      31        56781234

编辑:列名 [email,age,phone number] 不是恒定的,它们可以更改,因此列名在大多数情况下是未知的

【问题讨论】:

  • merge(left, right, on=['Name', 'E-mail'],...?
  • 列名并不总是已知的,它们可以从不同的数据帧中改变
  • 如果是这种情况,那么您需要更好地解释您想使用什么逻辑来处理此类重复。您可以考虑将所有重复列视为键df1.merge(df2) 的合并,或者您可以仅信任一个 DataFrame 中的列(例如左侧)并仅合并名称,从右侧框架中删除所有其他重叠列。但这两者的结果可能大不相同。
  • pd.merge(df1, df2)有什么问题?

标签: python excel pandas join merge


【解决方案1】:

仅供参考,你不需要reduce函数,你可以简单地使用:

df_all = df1.merge(df2)

这是重复的列,因为您正在合并“名称”。如果您的所有列都相同,您可以删除 on='Name' 参数,它将在所有常见列上合并而不是复制它们。

或者,您可以仅合并 df2 中的非重复列:

df_all = df1.merge(df2[['Name','Age']])

【讨论】:

    【解决方案2】:

    您也可以使用函数join

    COMMON_COLUMNS = ["name", "email"]
    df3 = df1.join(df2.set_index(COMMON_COLUMNS), on=COMMON_COLUMNS)
    
    df3 = df3.drop_duplicates(subset=COMMON_COLUMNS, keep='first')
    
    

    您可以在加入之前或之后删除重复项。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 2018-11-01
      • 1970-01-01
      • 2017-05-06
      • 2022-01-27
      • 2012-02-08
      • 2017-12-16
      • 2021-02-23
      • 2018-05-01
      相关资源
      最近更新 更多