如何在一定的约束条件下,创建一个包含所有可能的整数排列组合的数据框架?

问题描述 投票:0回答:2

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

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

我想根据我刚才描述的约束条件,制作一个DataFrame,其中包含所有可能的排列组合。顺序很重要(例如,[5,5,0,0,0,0,0,0,0,0,0]和[5,0,5,0,0,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.permutationsit.combinations_with_replacement,结果列表的长度为30。为什么 it.permutations 不返回任何东西?

python permutation itertools
2个回答
3
投票

这是个简单的解决方法!

因为顺序很重要,所以你要找的是 itertools.product 我知道,这是一个奇怪的名字)。这里是文档。https:/docs.python.org3libraryitertools.html#itertools.product#。.

解决办法:

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

1
投票

你不能从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 以找到所有的方法来排列该值集。)


1
投票

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

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个结果。

© www.soinside.com 2019 - 2024. All rights reserved.