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

