【问题标题】:How do I create a data frame with every possible permutation of integers with certain constraints?如何创建具有某些约束的整数的所有可能排列的数据框?
【发布时间】:2020-06-04 22:05:21
【问题描述】:

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

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

我想根据我刚刚描述的约束条件创建一个具有所有可能排列的 DataFrame。顺序很重要(即 [5,5,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 什么都不返回?

【问题讨论】:

    标签: python permutation itertools


    【解决方案1】:

    这很容易解决!

    由于订单很重要,您实际上是在寻找 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]
    

    【讨论】:

    • 你没有看错,我写错了。我打算声明整数必须小于或等于 5。我编辑了我的问题以澄清这一点。
    • 啊,明白了!然后我将删除其他注释:)
    • 另外,我认为问题可能是非负整数,因为 0 不是正整数。
    • 糟糕,已修复。谢谢你的收获!
    【解决方案2】:

    您无法从 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 来查找排序该组值的所有方式。)

    【讨论】:

    • 那么有什么方法可以让我得到我想要得到的东西吗?因为使用 it.combinations_with_replacement 只会给我一个包含 30 个元素的列表,而应该有更多。我想我需要像 permutations_with_replacements 这样的东西?虽然我可能还是有误会。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多