基于条件的列组合

时间:2019-07-12 08:28:06

标签: python python-3.x pandas jupyter-notebook

我有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个),并对此施加条件,将花费大量时间运行这个

1 个答案:

答案 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')
  1. 生成所有父母组合:
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')]