如何修改Python代码生成DataFrame列的所有子集组合结果?
问题描述
现有如下DataFrame:
12 2 17 16 4 16 2 19 11
期望得到的跨列输出结果:
[ [12,16,2],[2,4,19],[17,16,11],[[12,16,2],[2,4,19]],[[2,4,19],[17,16,11]],[[12,16,2],[2,4,19],[17,16,11]] ]
当前使用的Python代码仅能生成前3种单个列的结果:
from itertools import combinations resultTmp2 = [] for j in range(1, len(dataframe.columns) + 1): resultTmp = [] for xVal in list(combinations(dataframe.iloc[:len(dataframe) + 1,j-1], len(dataframe) )): resultTmp.append(list(xVal)) resultTmp2.append(resultTmp) print(resultTmp2)
需要修改代码以得到预期的完整输出。
解决方案
你的需求本质是生成所有非空的列组合,每个组合对应该组合下所有列的列值列表集合。修改思路如下:
- 先提取DataFrame所有列的列表形式,把每一列转成独立列表
- 遍历从1到总列数的所有长度,生成对应长度的列组合
- 将每个组合按要求的结构加入结果列表
修改后的完整代码:
from itertools import combinations import pandas as pd # 构造示例DataFrame(如果已有可省略) dataframe = pd.DataFrame([[12,2,17], [16,4,16], [2,19,11]]) # 提取所有列的列表形式 column_lists = [list(col) for col in dataframe.values.T] result = [] # 遍历组合长度:1到总列数(包含) for length in range(1, len(column_lists)+1): # 生成当前长度下的所有列组合 for combo in combinations(column_lists, length): # 单个列直接加入列表,多列组合转成嵌套列表加入 result.append(combo[0] if length == 1 else list(combo)) print(result)
代码说明
dataframe.values.T:将DataFrame转置,让原每一列变成一行,再转成列表得到所有列的集合column_listscombinations(column_lists, length):生成指定长度的所有列组合,比如长度为2时,会生成([12,16,2], [2,4,19])和([2,4,19], [17,16,11])两个组合- 最后根据组合长度调整结构,确保输出和预期完全匹配
运行代码后即可得到你需要的完整嵌套列表结果。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

