生成DataFrame所有行列组合列表失败,求排查代码问题
代码问题分析与修正方案
需求说明
给定如下DataFrame:
2 6 8 5
需要生成如下结构的嵌套列表:
[ [[2],[6,5]], [[2],[6]], [[2],[5]], [[8],[6,5]], [[8],[6]], [[8],[5]], [[6],[2,8]], [[6],[8]], [[6],[2]], [[5],[2,8]], [[5],[2]], [[5],[8]], [[6,5],[2,8]] ]
你的代码存在的问题
1. 循环逻辑完全偏离需求
你的多层嵌套循环(i/j/k)没有抓住需求核心:需求是把DataFrame拆分为左右两列(左列[2,8]、右列[6,5]),生成左列非空子集与右列非空子集的两两组合,再加上右列非空子集与左列非空子集的两两组合。但你的循环只是无意义地切片DataFrame、生成不相关组合,完全没对应这个分组逻辑。
2. combinations参数错误
combinations(dataframe.iloc[k:i,j], i)中第二个参数是组合长度,你用了从0开始的循环变量i,不仅会生成空组合,而且组合长度和需求里的「任意非空子集(长度1或2)」完全不匹配。
3. 列表引用未重置导致冗余数据
resListTmp、resListTmp2没有在循环内重新初始化,每次循环都往同一个列表追加元素,最终resList会充满重复引用和无效数据,结构彻底混乱。
4. 未区分左右列的分组逻辑
你没有把DataFrame拆分为左右两个独立集合处理,而是混在一起遍历,根本无法生成需求中「左列子集配右列子集、右列子集配左列子集」的结构。
修正后的代码
import pandas as pd from itertools import chain, combinations # 读取Excel数据 df = pd.read_excel("C:\\Users\\user\\Desktop\\testData.xlsx", index_col=False, header=None) # 拆分出左右两列的列表 col_left = df.iloc[:, 0].tolist() # 左列:[2, 8] col_right = df.iloc[:, 1].tolist() # 右列:[6, 5] # 生成一个列表的所有非空子集 def get_non_empty_subsets(data_list): # 生成所有长度1到len(data_list)的组合,转成列表格式 all_subsets = chain.from_iterable(combinations(data_list, r) for r in range(1, len(data_list)+1)) return [list(subset) for subset in all_subsets] # 获取左右列的所有非空子集 left_subsets = get_non_empty_subsets(col_left) right_subsets = get_non_empty_subsets(col_right) # 生成正向组合:左子集 + 右子集 result = [[ls, rs] for ls in left_subsets for rs in right_subsets] # 生成反向组合:右子集 + 左子集 result.extend([[rs, ls] for rs in right_subsets for ls in left_subsets]) # 输出结果 print(result)
这段代码会直接生成你需要的嵌套列表结构,需求里的最后一项[[6,5],[2,8]]已经包含在反向组合中。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

