如何按含重复值的id列合并两个Pandas DataFrame并对应日期列
解决方案:按ID分组添加行号后合并
要实现按ID对应日期序列的合并,核心是给每个ID下的记录添加组内序号,再通过ID和序号共同匹配,让同ID下的第N条预测日期对应第N条实际日期,不足的位置自动填充NA。
步骤1:为两个DataFrame添加组内序号
使用groupby('id').cumcount()生成每个ID内的行索引(从0开始):
import pandas as pd # 原始数据 df1 = pd.DataFrame({ 'id': ['1', '1', '1', '2', '2', '2', '3', '3'], 'predicted_date': ['2022-01-01', '2022-02-01', '2022-03-01', '2022-01-01', '2022-02-01', '2022-03-01', '2022-01-01','2022-02-01'] }) df2 = pd.DataFrame({ 'id': ['1', '1', '2', '2', '3', '3', '3', '3'], 'actual_date': ['2022-01-02', '2022-02-02', '2022-03-02', '2022-01-02', '2022-02-02', '2022-03-02', '2022-01-02','2022-02-02'] }) # 添加组内序号 df1['seq'] = df1.groupby('id').cumcount() df2['seq'] = df2.groupby('id').cumcount()
步骤2:按ID和序号合并
使用merge方法,指定on=['id', 'seq']并设置how='outer'保留所有记录,缺失值自动补NA:
merged_df = pd.merge(df1, df2, on=['id', 'seq'], how='outer') # 可选:删除序号列,得到目标结构 merged_df = merged_df.drop('seq', axis=1)
最终结果
输出的merged_df结构如下:
| id | predicted_date | actual_date |
|---|---|---|
| 1 | 2022-01-01 | 2022-01-02 |
| 1 | 2022-02-01 | 2022-02-02 |
| 1 | 2022-03-01 | NaN |
| 2 | 2022-01-01 | 2022-01-02 |
| 2 | 2022-02-01 | 2022-03-02 |
| 2 | 2022-03-01 | NaN |
| 3 | 2022-01-01 | 2022-02-02 |
| 3 | 2022-02-01 | 2022-03-02 |
| 3 | NaN | 2022-01-02 |
| 3 | NaN | 2022-02-02 |
这样既实现了同ID下日期序列的对应,又保留了所有原始记录,缺失位置自动用NA填充。
内容的提问来源于stack exchange,提问作者Olyalya
相关产品推荐
相关产品推荐

