我有一个包含输出和功能的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.
我有办法做到这一点吗?
答案 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))