使用pandas将DataFrame的列表列展开为所有可能幂集的实现方法
实现思路很简单,核心是先为每个nodes列表生成全部非空幂集,再用explode展开即可,具体步骤和可运行代码如下:
实现步骤
- 基于
itertools.combinations实现非空幂集生成函数,跳过空集,按子集长度从小到大生成所有组合 - 对DataFrame的
nodes列调用apply方法,将每个列表替换为其对应的非空幂集 - 调用pandas原生的
explode方法展开处理后的nodes列,其余列会自动复用原行的数值
完整代码
import pandas as pd from itertools import combinations # 定义非空幂集生成函数 def get_non_empty_powerset(lst): powerset = [] # 遍历子集长度从1到原列表长度 for subset_len in range(1, len(lst) + 1): # 生成对应长度的所有组合,转成列表后加入结果 powerset.extend([list(comb) for comb in combinations(lst, subset_len)]) return powerset # 构造你的示例DataFrame df = pd.DataFrame( data={ "id": [0, 3], "t": [2, 2], "value": [0.032396, 0.060529], "nodes": [[1, 2], [1, 2, 3]], "sup": [0, 0] }, index=[1, 10] ) # 处理数据 df["nodes"] = df["nodes"].apply(get_non_empty_powerset) # explode展开,如需保留原始行索引可删除reset_index方法 result = df.explode("nodes").reset_index(drop=True) # 输出结果 print(result)
补充说明
如果你的实际需求不是标准的全量非空幂集,只要修改get_non_empty_powerset函数内的子集生成逻辑即可适配不同的展开规则。
内容的提问来源于stack exchange,提问作者sos
相关产品推荐
相关产品推荐

