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_
相关产品推荐
相关产品推荐

