我如何创建一个数据帧,其中包含具有特定约束的所有可能的整数排列?

2024-09-28 01:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有十列:n1,n2,n3,n4,n5,n6,n7,n8,n9,n10

单行中的值加起来必须正好是10,并且所有值必须是小于或等于5的非负整数

我想根据我刚才描述的约束条件,制作一个具有各种可能排列的数据帧。顺序事项(即,[5,5,0,0,0,0,0,0,0,0]和[5,0,5,0,0,0,0,0]都应该是单独的行)

以下是我的尝试:

import itertools as it

permutations = [i for i in it.permutations(range(0,6), 10) if sum(i)==10]

df = pd.DataFrame(data=permutations,columns=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10'])

问题是df中没有行。数组permutations为空。我不明白这是为什么。如果我用it.combinations_with_replacement替换it.permutations,结果列表的长度是30。为什么it.permutations什么也不返回


Tags: dfit整数单行n2n6n3n1
3条回答

这很容易解决

因为顺序很重要,所以您实际上在寻找itertools.product(我知道,这是个奇怪的名字)。以下是文档:https://docs.python.org/3/library/itertools.html#itertools.product

解决方案:

import itertools as it
permutations = [i for i in it.product(range(6), repeat=10) if sum(i) == 10]

您无法从6项列表中获得10项的排列。(也许“排列”并不是你认为的意思。)

这里有一种方法可以得到你想要的(尽管它需要一段时间才能运行):

permutations = []
for p in [i for i in it.combinations_with_replacement(range(0,6), 10) if sum(i)==10]:
    permutations += [x for x in set(it.permutations(p))]

(说明:每个p都是选择10组具有适当总和的值的方法。我们使用permutations找到对该组值排序的所有方法。)

你选择了错误的方式来重复事情

import itertools as it

permutations = [i for i in it.product(*it.repeat(range(6),10)) if sum(i)==10]

df = pd.DataFrame(data=permutations,columns=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10'])

这将得到大约85228个结果

相关问题 更多 >

    热门问题