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

pandas如何实现从DataFrame每行取3值生成所有跨行列组合

实现方案

需求规则

  • 基于给定的3行pandas DataFrame生成值组合
  • 每个组合共9个值:前3个从第一行选取,中间3个从第二行选取,最后3个从第三行选取
  • 每行选取3个值时不重复取同一位置的值
  • 最终所有组合存入新的DataFrame

示例输入DataFrame结构:

0           1             2            3             4              5               6
Table       Black         Brown       Red           Blue          Green          Amber
Chair       Magenta       Turquoise   White         Orange        Violet         Pink
Window      Indigo        Yellow      Cerulean      Grey          Peach          Aqua

原有代码问题

之前使用的全列笛卡尔积代码逻辑错误:

from itertools import product
uniques = [df[i].unique().tolist() for i in df.columns ]
pd.DataFrame(product(*uniques), columns = df.columns)

该代码对所有列的去重值做全量交叉,生成的是7列的全笛卡尔积,完全不符合按行选值再拼接的规则。

正确实现代码

核心思路:先分别生成单一行选3个值的所有组合,再对三行的组合集合做笛卡尔积,最后拼接成最终结果:

from itertools import product, combinations
import pandas as pd

# 提取每行的有效值(跳过第一列的行标识:Table/Chair/Window,不需要可删除[:,1:]切片)
row1 = df.iloc[0, 1:].to_list()
row2 = df.iloc[1, 1:].to_list()
row3 = df.iloc[2, 1:].to_list()

# 生成每行选3个值的所有不重复组合
comb_row1 = combinations(row1, 3)
comb_row2 = combinations(row2, 3)
comb_row3 = combinations(row3, 3)

# 三行组合做笛卡尔积,拼接为9个元素的单条记录
all_records = [c1 + c2 + c3 for c1, c2, c3 in product(comb_row1, comb_row2, comb_row3)]

# 转换为DataFrame
result_df = pd.DataFrame(
    all_records,
    columns = [f"第一行选值{i}" for i in range(1,4)] + 
              [f"第二行选值{i}" for i in range(1,4)] + 
              [f"第三行选值{i}" for i in range(1,4)]
)

补充说明:如果需要同一行选值考虑顺序,把combinations替换为permutations即可;如果允许同一行重复选值,可自定义选值逻辑替换combinations部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:24:57