如何合并dfs而不重复行

问题描述 投票:0回答:1

我的数据框类似于下面

df1:

   user  name    length  job
0  5234  Ed      7       manager
1  4793  Mark    14      admin
2  9321  Nick    8       admin
3  8149  Duncan  3       admin
4  3742  John    9       admin
5  7315  Lucy    12      admin
6  6541  Heidi   25      admin

DF 2:

   user  name    open  click
0  5234  Ed      3     1
1  4793  Mark    
2  9321  Nick    5     4
3  8149  Duncan  1     0
4  8149  Duncan  2     1
5  3742  John    21    3   
6  6541  Heidi   7     2

我想要的结果是:

   user  name    length  job      open click
0  5234  Ed      7       manager  3    1
1  4793  Mark    14      admin    NaN  Nan
2  9321  Nick    8       admin    5    4
3  8149  Duncan  3       admin    3    1
4  3742  John    9       admin    21   3
5  7315  Lucy    12      admin    NaN  NaN
6  6541  Heidi   25      admin    7    2

目前我正在使用此代码:

df3  = pd.merge(df1, df2, left_on='user', right_on='user', how='left',
               suffixes=('', '_y')).filter(regex='^(?!.*_y)')

但是,当我使用此代码合并它们时,我最终得到 Duncan 的重复行而不是一行。请问我怎样才能实现这个目标?我应该补充一点,我的实际 dfs 有几百行长 - 大多数合并都很好,但有几个是重复的。

python pandas dataframe merge
1个回答
0
投票

由于您在 df2 上有 Duncan 的多个记录,因此您需要在合并之前将值求和为:

df2_merged = df2.groupby(['user', 'name'], as_index=False).sum()
print('df2_merged\n',df2_merged)

Output:
    df2_merged
            user    name  open  click
        0  3742    John  21.0    3.0
        1  4793    Mark   0.0    0.0
        2  5234      Ed   3.0    1.0
        3  6541   Heidi   7.0    2.0
        4  8149  Duncan   3.0    1.0
        5  9321    Nick   5.0    4.0

在此预处理步骤之后,您可以与 df1 合并:

df3=df1.merge(df2_merged,left_on=['user','name'], right_on=['user','name'], how='left')

最后,您可以填写 Nans 或零分机。

© www.soinside.com 2019 - 2024. All rights reserved.