我有十列: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.permutations
与 it.combinations_with_replacement
,结果列表的长度为30。为什么 it.permutations
不返回任何东西?
因为顺序很重要,所以你要找的是 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]
你不能从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个结果。