创建一个 table 包含所有可能的观察变体

Creating a table with all possible variations of observations

我有一个 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.

我有办法做到这一点吗?

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

  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)  )  )

为什么不是这样的:

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

如果使用 product combinatoric generator in the 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))