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

如何用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可高效实现动态适配,步骤如下:

  1. 拆分Pos列,将每个值转为包含两个选项的列表
  2. 生成所有长度匹配数据集行数的(0,1)组合掩码,0代表选第一个选项,1代表选第二个选项
  3. 遍历每个掩码组合,为每行选择对应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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:10:21