【问题标题】:merge two dataframes without repeats pandas合并两个数据框而不重复熊猫
【发布时间】:2017-11-13 01:11:00
【问题描述】:

我正在尝试合并两个数据框,一个包含列:customerId、全名和电子邮件,另一个数据框包含列:customerId、金额和日期。我想让第一个数据框成为主数据框,并包含其他数据框信息,但前提是客户 ID 匹配;我试着做:

 merge = pd.merge(df, df2, on='customerId', how='left')

但是生成的数据框包含很多重复并且看起来不对:

customerId  full name   emails  amount  date
0   002963338   Star shine  star.shine@cdw.com  $2,910.94   2016-06-14
1   002963338   Star shine  star.shine@cdw.com  $9,067.70   2016-05-27
2   002963338   Star shine  star.shine@cdw.com  $6,507.24   2016-04-12
3   002963338   Star shine  star.shine@cdw.com  $1,457.99   2016-02-24
4   986423367   palm tree   tree.palm@snapchat.com,tree@.com    $4,604.83   2016-07-16

这不可能,请帮忙!

【问题讨论】:

    标签: python pandas merge ipython ipython-notebook


    【解决方案1】:

    customerId 列中有重复项存在问题。

    所以解决方案是删除它们,例如drop_duplicates:

    df2 = df2.drop_duplicates('customerId')
    

    示例:

    df = pd.DataFrame({'customerId':[1,2,1,1,2], 'full name':list('abcde')})
    print (df)
       customerId full name
    0           1         a
    1           2         b
    2           1         c
    3           1         d
    4           2         e
    
    df2 = pd.DataFrame({'customerId':[1,2,1,2,1,1], 'full name':list('ABCDEF')})
    print (df2)
       customerId full name
    0           1         A
    1           2         B
    2           1         C
    3           2         D
    4           1         E
    5           1         F
    

    merge = pd.merge(df, df2, on='customerId', how='left')
    print (merge)
        customerId full name_x full name_y
    0            1           a           A
    1            1           a           C
    2            1           a           E
    3            1           a           F
    4            2           b           B
    5            2           b           D
    6            1           c           A
    7            1           c           C
    8            1           c           E
    9            1           c           F
    10           1           d           A
    11           1           d           C
    12           1           d           E
    13           1           d           F
    14           2           e           B
    15           2           e           D
    
    df2 = df2.drop_duplicates('customerId')
    merge = pd.merge(df, df2, on='customerId', how='left')
    print (merge)
       customerId full name_x full name_y
    0           1           a           A
    1           2           b           B
    2           1           c           A
    3           1           d           A
    4           2           e           B
    

    【讨论】:

      【解决方案2】:

      我没有看到整行重复,但 customerId 中有重复。您可以使用以下方法删除它们:

          df.drop_duplicates('customerId', inplace = 1) 
      

      其中 df 可以是对应于数量或一个获得的合并后的数据帧。如果你想要更少的行(比如 n),你可以使用:

          df.groupby('customerId).head(n)
      

      【讨论】:

        猜你喜欢
        • 2017-11-26
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多