
本文介绍如何使用 itertools.product 与 dataframe.merge(..., how='cross'),为原始数据中固定字段(如 uni、region)的每一行,自动补全多列分类变量(如 level_edu、gender 等)的所有笛卡尔积组合,高效生成完整枚举数据集。
本文介绍如何使用 itertools.product 与 dataframe.merge(..., how='cross'),为原始数据中固定字段(如 uni、region)的每一行,自动补全多列分类变量(如 level_edu、gender 等)的所有笛卡尔积组合,高效生成完整枚举数据集。
在数据分析与模拟场景中,常需将部分缺失的分类变量(如教育层级、性别、学习时段等)按所有合法取值进行穷举填充,从而将一条原始记录扩展为多条完备观测。例如,当原始 DataFrame 中 Level_Edu、Financial_Base、Learning_Time 和 GENDER 四列全为 NaN,而它们分别有 3、2、3、2 种可能取值时,每条原始记录应扩展为 $3 \times 2 \times 3 \times 2 = 36$ 条新记录。
核心思路是:分离不变字段与可变维度 → 构建笛卡尔积 → 交叉合并。具体步骤如下:
- 提取不变字段:仅保留 Uni、Region、Profession 等已填充列;
-
定义可变取值字典:
data = { 'Level_Edu': ['undergrad', 'grad', 'PhD'], 'Financial_Base': ['personal', 'grant'], 'Learning_Time': ['morning', 'day', 'evening'], 'GENDER': ['Male', 'Female'] } -
生成全组合 DataFrame:利用 itertools.product(*data.values()) 生成元组迭代器,并转为 DataFrame:
from itertools import product combinations_df = pd.DataFrame(product(*data.values()), columns=data.keys())
-
执行交叉连接(Cross Join):使用 merge(..., how='cross') 将不变字段与组合表无条件配对:
base_cols = ['Uni', 'Region', 'Profession'] result = (sample_data_as_is[base_cols] .merge(combinations_df, how='cross'))
✅ 推荐写法(保证列序与业务逻辑一致):
Codex Sub Agents 1下载使用 OpenAI Codex CLI 处理编码任务。触发词:codex、code review、fix CI、refactor code、implement feature、coding agent、gpt-5-codex。Clawdbot 可将编码工作委托给 Codex CLI 作为子代理或直接工具。
cols = ['Uni', 'Region', 'Profession'] result = (pd.DataFrame(product(*data.values()), columns=data.keys()) .merge(sample_data_as_is[cols], how='cross') [cols + list(data.keys())])
该方法优势显著:
- 零循环、纯向量化:避免显式 for 循环或 apply,性能优异;
- 可扩展性强:增删分类变量只需更新 data 字典,无需修改主逻辑;
- 兼容性好:how='cross' 自 Pandas 1.2.0 起原生支持,推荐使用;若版本较旧,可用 how='left' 配合 assign(key=1).merge(...assign(key=1), on='key') 替代。
最终输出 DataFrame 行数 = 原始行数 × 各维度取值数乘积(本例:2 × 36 = 72 行),列顺序清晰可控,可直接用于后续建模、可视化或模拟分析。











