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

Pandas如何实现两个DataFrame按维度全组合的合并操作

解决方案

问题根因

你原本使用的外连接仅会合并两个DataFrame中已存在的period、customer、product维度组合,不会自动生成所有维度值的全量笛卡尔积,因此无法得到预期的9条全组合结果。

实现步骤

方法1:通过MultiIndex生成全组合基础表后左连接

import pandas as pd

# 初始化示例数据
df1 = pd.DataFrame({'period':['2021-02'], 'customer':['A'], 'product':['Apple'], 'sales_flag': ['Yes']})
df2 = pd.DataFrame({'period':['2021-03', '2021-04', '2021-04'], 'customer':['A', 'A', 'A'], 'product':['Banana', 'Apple', 'Tangerine'], 'feedback_flag': ['Yes', 'Yes', 'No']})

# 1. 提取三个维度的所有唯一值
all_period = pd.concat([df1['period'], df2['period']]).unique()
all_customer = pd.concat([df1['customer'], df2['customer']]).unique()
all_product = pd.concat([df1['product'], df2['product']]).unique()

# 2. 生成三个维度的全量组合作为基础表
base_df = pd.MultiIndex.from_product(
    [all_period, all_customer, all_product],
    names=['period', 'customer', 'product']
).to_frame(index=False)

# 3. 分别左连df1和df2补全标志字段,空值填充为NULL
result = base_df.merge(df1, on=['period', 'customer', 'product'], how='left')\
                .merge(df2, on=['period', 'customer', 'product'], how='left')\
                .fillna('NULL')

方法2:交叉连接生成基础表

如果更习惯用merge的cross参数,也可以用下面的方式生成基础表:

base_df = all_period.to_frame(name='period')\
            .merge(all_customer.to_frame(name='customer'), how='cross')\
            .merge(all_product.to_frame(name='product'), how='cross')

执行后得到的result和你给出的预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 06:36:03