如何在Pandas中合并含重复ID的数据集并避免月份列重复?
解决Pandas合并时笛卡尔积与多Month列问题
你需要基于SubscriberId + MONTH双列进行合并,同时使用全外连接保留所有用户-月份组合,缺失数据自动留空,具体方案如下:
核心解决方案
如果两个表的用户ID列都是SubscriberId、月份列都是MONTH,直接修改merge的连接键和连接方式:
merged_df = pd.merge(df1, df2, on=['SubscriberId', 'MONTH'], how='outer')
on=['SubscriberId', 'MONTH']:同时匹配用户ID和月份,彻底避免单一ID匹配导致的笛卡尔积how='outer':保留两个表中所有的(SubscriberId, MONTH)组合,某表中没有对应数据的字段会自动填充NaN(即留空)
适配月份列名不同的情况
如果df1和df2的月份列名不一致(比如df1是MONTH,df2是EMAIL_MONTH),用left_on和right_on指定对应列:
merged_df = pd.merge( df1, df2, left_on=['SubscriberId', 'MONTH'], right_on=['SubscriberId', 'EMAIL_MONTH'], how='outer' ) # 删除多余的月份列 merged_df = merged_df.drop('EMAIL_MONTH', axis=1)
示例验证
假设你的数据如下:
df1(收入数据):
| SubscriberId | MONTH | INCOME |
|---|---|---|
| 101 | 2024-01 | 500 |
| 101 | 2024-02 | 600 |
| 102 | 2024-01 | 300 |
df2(邮件数据):
| SubscriberId | MONTH | SENT_EMAILS |
|---|---|---|
| 101 | 2024-01 | 5 |
| 102 | 2024-02 | 3 |
| 103 | 2024-01 | 2 |
合并后结果:
| SubscriberId | MONTH | INCOME | SENT_EMAILS |
|---|---|---|---|
| 101 | 2024-01 | 500 | 5 |
| 101 | 2024-02 | 600 | NaN |
| 102 | 2024-01 | 300 | NaN |
| 102 | 2024-02 | NaN | 3 |
| 103 | 2024-01 | NaN | 2 |
完美匹配你需要的格式:单一MONTH列,对应字段填充,无数据处留空。
内容的提问来源于stack exchange,提问作者Carlos Manuel Arroyo
相关产品推荐
相关产品推荐

