pandas 合并具有重复ID的两个数据集

e5nszbig  于 2023-05-05  发布在  其他
关注(0)|答案(2)|浏览(176)

我想用pandas合并两个数据集。代码工作,但输出不完全是我所期望的,因为我是基于ID的合并,一个可以出现多次,但在其他列中有不同的值。
我的df 1如下:
| SubscriberKey|订阅者ID|月|收入|
| --------------|--------------|--------------|--------------|
| 96346d046d42d923ed97d974f26addce04fa7324b3e1f9e69a31f297073ca06f|电话:125557370|四|二百零四|
| f75e979a030f595ba091f0a060135b733c98345b62836a278e221f503f879057|电话:125557375|七|三二九|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|三|一百四十四|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|六|八十二|
其中每一行对应于一个用户。然而,如在df 2中,每个用户可以有多于一个条目,因为每个条目对应于一个用户的每月收入。说到这里,我想使用基于订阅者ID的方式将另一个数据集合并到这个数据集中。我想合并的数据集是df 2:
| 订阅者ID|月|发送_电子邮件|
| --------------|--------------|--------------|
| 电话:125557388传真:125557388|四|1|
| 电话:125557388传真:125557388|八|1|
| 电话:125557388传真:125557388|1|1|
| 电话:125557388传真:125557388|六|1|
| 125557400|四|1|
| 125557400|六|1|
正如你所看到的,这个用户在这一个中出现了4次,我们可以看到每个用户在一个月内发送了多少封电子邮件。我使用代码**pd.merge(df 1,df 2,on ='SubscriberId)**得到以下结果:
| SubscriberKey|订阅者ID|月_x|收入|月_y|发送_电子邮件|
| --------------|--------------|--------------|--------------|--------------|--------------|
| f75e979a030f595ba091f0a060135b733c98345b62836a278e221f503f879057|电话:125557375|七|三二九|二|1|
| f75e979a030f595ba091f0a060135b733c98345b62836a278e221f503f879057|电话:125557375|七|三二九|五|1|
| f75e979a030f595ba091f0a060135b733c98345b62836a278e221f503f879057|电话:125557375|七|三二九|六|二|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|三|一百四十四|四|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|三|一百四十四|八|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|三|一百四十四|1|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|三|一百四十四|六|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|六|八十二|四|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|六|八十二|八|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|六|八十二|1|1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388传真:125557388|六|八十二|六|1|
我需要在代码中添加什么,以便最终结果看起来像这样:
| SubscriberKey|订阅者ID|月|收入|发送_电子邮件|
| --------------|--------------|--------------|--------------|--------------|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388|四||1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388|八||1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388|1||1|
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388|六|八十二||
| 9f355d3154658f70ea6104cf4d5581f1c57c28c956dcbd49370e3d004ea8ecbd|电话:125557388|三|一百四十四||
我想避免重复MONTH列,并且只填充它的“sent_emails”部分或“income part”,而不是基于ID的所有可能组合。

7ivaypg9

7ivaypg91#

IIUC,你可以试试这个:

#for the sake of clarify, I dropped the `SubscriberKey` in both dataframes
#...
tmp = df1.merge(df2.drop(columns="MONTH"), on="SubscriberId").drop_duplicates()
​
out = (pd.concat([df1, df2]).loc[lambda x: x["SubscriberId"].isin(tmp["SubscriberId"])]
            .drop_duplicates(subset=["SubscriberId", "MONTH"]).sort_index())

输出:

print(out)

   SubscriberId  MONTH  INCOME  SENT_EMAILS
0     125557388      4     NaN         1.00
1     125557388      8     NaN         1.00
2     125557388      3  144.00          NaN
2     125557388      1     NaN         1.00
3     125557388      6   82.00          NaN
goqiplq2

goqiplq22#

result = pd.merge(df1, df2, on=['SubscriberId', 'MONTH'], how='left')

这应该可以!

相关问题