创建一个 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))
我有一个 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))