我有370列,并且必须生成2、3和4列的唯一组合。但是,在某些情况下,我需要在组合上应用这些条件(请首先参见下表,并在下文中需要应用条件)
My columns are named in this fashion
Column 1 Name : 'Real'
Column 2 Name : 'Real_lag1'
Column 3 Name : 'Real_lag2'
Column 4 Name : 'Real_lag3'
Column 5 Name : 'Real_lag4'
Column 6 Name : 'Normal'
Column 7 Name : 'Normal_chng'
Column 9 Name : 'Normal_diff'
Column 10 Name : 'Andi_diff'
Column 11 Name : 'Vari_lag1'
Column 12 Name : 'Teo_diff'
Column 13 Name : 'Lan_diff'
.
.
.
.
基本上,我有24个唯一值,这些值已被滞后,转换为370个变量(如上所示)等。例如,您可以看到_lag _chng,_diff都是24个唯一列的转换(例如'Real' ,“普通”,“安迪”,“瓦里”,“特奥”,“兰”等)
我想生成这370个变量的唯一组合,但是只有一个变量可以来自父变量。
例如,“ Real”和“ Real_lag1”不能一起出现在组合中。
如果尝试运行所有组合(使用370个),则总共有776,741,925个组合(一次2个,一次3个,一次4个),并对此施加条件,将花费大量时间运行这个
答案 0 :(得分:0)
假设您的数据位于名为df
的数据框中
1.获取所有列名称的列表
col_names = df.columns
2。将父母与孩子的名字分开(我很乐意提供更好看的代码的建议!)
tmp = [col.split('_') for col in col_names]
parent_child = {}
for col in tmp:
if len(col)>1:
if col[0] not in parent_child.keys():
parent_child[col[0]] = [col[0]]
if (col[0] in parent_child.keys()) and (col[1] not in parent_child.values()):
parent_child[col[0]].append(col[1])
else:
parent_child[col[0]] = [col[0]]
>> parent_child
{'Andi': ['Andi', 'diff'],
'Lan': ['Lan', 'diff'],
'Normal': ['Normal', 'chng', 'diff'],
'Real': ['Real', 'lag1', 'lag2', 'lag3', 'lag4'],
'Teo': ['Teo', 'diff'],
'Vari': ['Vari', 'lag1']}
根据您的示例,因为独立的父母姓名也是一个选项,所以我将父母姓名添加到了孩子的列表中。
3.获取2个父母的所有组合(相应地适应3个或4个父母)
comb2 = list(itertools.combinations(list(parent_child.keys()),2)
comb2
('Real', 'Normal')
('Real', 'Andi')
('Real', 'Vari')
...
('Andi', 'Lan')
('Vari', 'Teo')
('Vari', 'Lan')
('Teo', 'Lan')
combinations = []
for p in comb2:
for v1 in parent_child[p[0]]:
for v2 in parent_child[p[1]]:
print(v1, p[0], v2, p[1])
if v1 == p[0]:
name1 = p[0]
else:
name1 = str(p[0]+'_'+v1)
if v2 == p[1]:
name2 = p[1]
else:
name2 = str(p[1]+'_'+v2)
combinations.append((name1,name2))
>> combinations
[('Real', 'Normal'),
('Real', 'Normal_chng'),
('Real', 'Normal_diff'),
('Real_lag1', 'Normal'),
('Real_lag1', 'Normal_chng'),
('Real_lag1', 'Normal_diff'),
('Real_lag2', 'Normal'),
('Real_lag2', 'Normal_chng'),
('Real_lag2', 'Normal_diff'),
('Real_lag3', 'Normal'),
...
('Vari', 'Lan'),
('Vari', 'Lan_diff'),
('Vari_lag1', 'Lan'),
('Vari_lag1', 'Lan_diff'),
('Teo', 'Lan'),
('Teo', 'Lan_diff'),
('Teo_diff', 'Lan'),
('Teo_diff', 'Lan_diff')]