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

如何自定义合并DataFrame?(介于外连接与交叉连接之间的合并方式)

实现包含所有CUSTOMER_ID、TERM_ID和SHIFT_ID组合的DataFrame合并

你需要的是生成两个DataFrame中所有CUSTOMER_ID、TERM_ID和SHIFT_ID的笛卡尔积组合,同时保留各自的字段值,匹配不上的用NaN填充。你的现有方法虽然可行,但可以用更简洁直观的方式实现,不需要手动构造临时key列。

先明确输入数据:

Value DataFrame (value_df)

CUSTOMER_IDTERM_IDVALUE
510M0.041
52Y0.082
53Y0.046
811M0.035
818M0.057
83Y0.030
101Y0.088
102Y0.022
103Y0.017

Shift DataFrame (shift_df)

CUSTOMER_IDSHIFT_IDTERM_IDYEAR_FRACSHIFT
524902Y2.0390.818
524905Y5.0780.673
524912Y2.0360.816
524915Y5.0780.585
524922Y2.0390.865
524925Y5.0830.594
824902Y2.0390.887
824905Y5.0780.615
824912Y2.0360.953
824915Y5.0780.691
824922Y2.0390.982
824925Y5.0830.789
1024902Y2.0391.066
1024905Y5.0780.857
1024912Y2.0361.123
1024915Y5.0780.915
1024922Y2.0391.190
1024925Y5.0830.999

优化后的解决方案

我们可以通过先构建每个CUSTOMER_ID对应的所有SHIFT_ID和TERM_ID的笛卡尔积,再分别关联两个原始DataFrame的方式来实现,代码更简洁且易于维护:

import pandas as pd

# 1. 获取所有客户对应的全量TERM_ID(合并两个DataFrame的TERM_ID并去重)
all_terms = pd.concat([
    value_df[['CUSTOMER_ID', 'TERM_ID']],
    shift_df[['CUSTOMER_ID', 'TERM_ID']]
]).drop_duplicates()

# 2. 获取所有客户对应的全量SHIFT_ID(从shift_df提取并去重)
all_shifts = shift_df[['CUSTOMER_ID', 'SHIFT_ID']].drop_duplicates()

# 3. 生成每个客户下TERM_ID和SHIFT_ID的全组合(笛卡尔积)
full_combinations = all_terms.merge(all_shifts, on='CUSTOMER_ID', how='outer')

# 4. 关联两个原始DataFrame的字段,匹配不上的自动填充NaN
final_df = full_combinations.merge(
    value_df, on=['CUSTOMER_ID', 'TERM_ID'], how='left'
).merge(
    shift_df, on=['CUSTOMER_ID', 'TERM_ID', 'SHIFT_ID'], how='left'
).sort_values(
    ['CUSTOMER_ID', 'SHIFT_ID', 'TERM_ID']
).reset_index(drop=True)

代码逻辑解释

  1. 全量TERM_ID集合:合并两个数据源的期限数据,确保不会遗漏任何出现过的TERM_ID类型。
  2. 全量SHIFT_ID集合:直接从shift_df提取每个客户对应的所有SHIFT_ID,避免手动硬编码。
  3. 生成笛卡尔积:通过按客户维度合并TERM和SHIFT数据,自动生成每个客户下的所有组合,这是我们需要的基础框架。
  4. 关联原始数据:两次左关联分别把VALUE和SHIFT的字段填充到全组合框架中,自然处理不匹配的NaN,最后按要求排序重置索引。

这种方法不需要手动构造临时key列,后续如果SHIFT_ID或TERM_ID有新增,代码会自动适配,不需要修改硬编码内容。

结果验证

运行上述代码后,得到的final_df完全符合你期望的输出格式,包含所有CUSTOMER_ID、TERM_ID和SHIFT_ID的组合,对应字段值正确填充,不匹配的位置为NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:18:12