创建一个包含所有可能的观察变化的表格

时间:2016-04-27 01:05:13

标签: python python-3.x combinations

我有一个包含输出和功能的Excel数据电子表格来预测此输出。例如,某个输出的行看起来与此类似:

 Y     X1     X2     X3     X4     X5
 A     Y      N      Y          

变量X1,X2和X3很重要,必须分别为Y,N,Y才能得到正确的Y输出。但是,X4和X5可以是任何东西。 X4可以是Y,N或NA; X5可以是任何数字1-10。我想使用Python来生成此输出的所有变体。所以我想要这样的东西:

Y     X1     X2     X3    X4     X5
A     Y      N      Y     Y      1
A     Y      N      Y     Y      2
A     Y      N      Y     Y      3
.
.
A     Y      N      Y     N      1
.
.
etc.

我有办法做到这一点吗?

3 个答案:

答案 0 :(得分:0)

您可以使用product模块的itertools功能。 以下是示例代码:

  from itertools import product

  X4 = ['Y', 'N', 'NA']
  X5 = list(range(1,11))
  Ct = ['A', 'Y', 'N', 'Y']

  for elt in  product(X4, map(str, X5) ) :
     print( '\t'.join( Ct[:] + list(elt)  )  )

答案 1 :(得分:0)

为什么不能这样:

def all_variations():
    rows = []
    for letter in ['Y', 'N', 'NA']:
        for number in range(1,11):
            row = ['A', 'Y', 'N', 'Y', letter, number]
            rows.append(row)
    return rows

如果你想要你的列名,你可以使用pandas并制作一个DataFrame:

import pandas as pd

data = all_variations()
cols = ['Y'] + ['X{number}'.format(number=num) for num in range(1,6)]
df = pd.DataFrame(rows, columns=cols)

print df

答案 2 :(得分:0)

如果在product模块中使用itertools组合生成器,则相当容易。

你还没有说出你想要输出的形式,所以我假设(csv文件式)制表符分隔的字符串。在for循环中生成的每个原始行都是一个像('Y', 'N', 'Y', 'NA', 7)这样的值的元组,但您可以根据需要随时更改它(下面显示了一个示例)。

from itertools import product

possible_observations = [
    ['Y'],             # X1
    ['N'],             # X2
    ['Y'],             # X3
    ['Y', 'N', 'NA'],  # X4
    range(1, 11)       # X5
]

print('\t'.join(('X1', 'X2', 'X3', 'X4', 'X5')))  # column headers
for row in product(*possible_observations):
    print('\t'.join(map(str, row)))

输出(»表示制表符):

X1»   X2»   X3»   X4»   X5
Y»    N»    Y»    Y»    1
Y»    N»    Y»    Y»    2
Y»    N»    Y»    Y»    3
Y»    N»    Y»    Y»    4
Y»    N»    Y»    Y»    5
Y»    N»    Y»    Y»    6
Y»    N»    Y»    Y»    7
Y»    N»    Y»    Y»    8
Y»    N»    Y»    Y»    9
Y»    N»    Y»    Y»    10
Y»    N»    Y»    N»    1
Y»    N»    Y»    N»    2
Y»    N»    Y»    N»    3
Y»    N»    Y»    N»    4
Y»    N»    Y»    N»    5
Y»    N»    Y»    N»    6
Y»    N»    Y»    N»    7
Y»    N»    Y»    N»    8
Y»    N»    Y»    N»    9
Y»    N»    Y»    N»    10
Y»    N»    Y»    NA»   1
Y»    N»    Y»    NA»   2
Y»    N»    Y»    NA»   3
Y»    N»    Y»    NA»   4
Y»    N»    Y»    NA»   5
Y»    N»    Y»    NA»   6
Y»    N»    Y»    NA»   7
Y»    N»    Y»    NA»   8
Y»    N»    Y»    NA»   9
Y»    N»    Y»    NA»   10

如果您想要保存列表中的所有变体,可以这样做:

possible_combinations = list(product(*possible_observations))