You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas Merge实现带全ID补全的左连接并补缺失行?

如何实现包含所有df2唯一id的DataFrame合并需求

我有两个DataFrame:df1和df2。df1包含id、dt、date列,df2包含id、date列及其他列。原本计划执行左合并:merged = pd.merge(df1, df2, on=['id', 'date'], how='left'),但还要求df1中每个dt对应的行都包含df2的所有唯一id,若缺失则插入对应id的行。请问能否通过merge实现该需求?

示例数据

# 注:实际dt和date为datetime类型,示例用整数代替
df1 = pd.DataFrame({
  "id": [1, 2, 1, 2],
  "dt": [10.1, 10.1, 11.1, 11.1],
  "date": [10, 10, 11, 11]
})

# id=3不存在于df1中
df2 = pd.DataFrame({
  "id": [1, 2, 3, 1, 2, 3],
  "date": [10, 10, 10, 11, 11, 11],
  "some_other_col": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]
})

# 期望合并结果:
merged = pd.DataFrame({
  "id": [1, 2, 3, 1, 2, 3],
  "dt": [10.1, 10.1, 10.1, 11.1, 11.1, 11.1],
  "date": [10, 10, 10, 11, 11, 11],
  "some_other_col": [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]
})

解决方案

直接用一次pd.merge无法实现该需求——原左合并只会保留df1中已有的id-date组合,无法自动补充df2中的其他id。需要先构建包含所有必要组合的基础表,再与df2合并,步骤如下:

  1. 提取dt与date的对应关系并去重
    从df1中取出dt和date列去重,得到每个dt对应的唯一date(根据示例数据,每个dt对应固定date):

    dt_date_map = df1[['dt', 'date']].drop_duplicates()
    
  2. 获取df2的所有唯一id

    unique_ids = df2['id'].unique()
    
  3. 构建笛卡尔积生成完整基础表
    把dt-date映射表和唯一id做笛卡尔积,得到每个dt对应的所有id-date组合:

    # 用pandas cross merge生成笛卡尔积
    id_df = pd.DataFrame({'id': unique_ids})
    base_df = dt_date_map.merge(id_df, how='cross')
    
  4. 与df2合并得到最终结果
    把基础表和df2做左合并(示例中df2包含所有id-date组合,内合并结果一致):

    merged = base_df.merge(df2, on=['id', 'date'], how='left')
    

运行以上代码后,即可得到期望的合并结果。

内容的提问来源于stack exchange,提问作者roulette01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:31:23