如何用Python/Pandas生成解析后二元分类变量的所有组合
问题描述
原始数据集如下:
id Fan Pos 10001 32.83 A/B 10005 71.60 A/B 10010 24.23 E/F 10011 48.81 G/H
需求:
拆解Pos列的X/Y格式,生成所有可能的Pos选项组合(每行选X或Y),每个组合对应一个Set标识,最终输出包含所有组合的DataFrame。组合数为2^行数,需动态适配任意行数的数据集,避免硬编码循环。
高效实现方案
用Pandas结合itertools.product可高效实现动态适配,步骤如下:
- 拆分
Pos列,将每个值转为包含两个选项的列表 - 生成所有长度匹配数据集行数的(0,1)组合掩码,0代表选第一个选项,1代表选第二个选项
- 遍历每个掩码组合,为每行选择对应
Pos值,添加Set标识后合并所有结果
具体代码
import pandas as pd from itertools import product # 初始化原始数据集 df = pd.DataFrame({ 'id': [10001, 10005, 10010, 10011], 'Fan': [32.83, 71.60, 24.23, 48.81], 'Pos': ['A/B', 'A/B', 'E/F', 'G/H'] }) # 1. 拆分Pos为可选选项列表 df['Pos_options'] = df['Pos'].str.split('/') # 2. 生成所有可能的选择掩码 row_count = len(df) all_combinations = product([0, 1], repeat=row_count) # 3. 构建每个Set的数据集并合并 result_list = [] for set_num, mask in enumerate(all_combinations, start=1): temp_df = df.copy() # 根据掩码选择对应Pos值 temp_df['Pos'] = [temp_df['Pos_options'].iloc[i][mask[i]] for i in range(row_count)] temp_df['Set'] = set_num temp_df = temp_df.drop('Pos_options', axis=1) result_list.append(temp_df) # 合并所有结果并调整列顺序 final_df = pd.concat(result_list, ignore_index=True) final_df = final_df[['Set', 'id', 'Fan', 'Pos']] print(final_df)
代码说明
itertools.product([0,1], repeat=row_count):自动根据数据集行数生成所有选择组合,完全适配动态行数- 掩码匹配逻辑直接定位每行的
Pos选项,避免冗余嵌套循环 - 用
pd.concat批量合并子数据集,效率优于逐行拼接操作
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

