从python中的两个单独的词典创建汇总数据

时间:2018-01-28 08:09:19

标签: python pandas dictionary

我在pandas数据框中有以下数据,其中每个部分属于一个类,学生也可以单独或按类包含一些高级课程。

Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1, SSE4.2

我有两个词典: class_dict:包含section和premium作为包的一部分。

student_id  Section A   Section B   Section C   Section D   Prem 1  Prem 2  Section E   Prem 3  Section F
1               0           12          0           1           9       0       24          12      45
2               9           19          24          24          2       29      25          4       24
3               19          24          26          18          20      0       2           0       17
4               26          11          29          11          28      1       18          25      4
5               14          23          11          8           17      6       1           25      14

prem_dict:仅包含高级类。

Class A :   {Section A, Section B, Prem 1}                              
Class B :   {Section C, Section D, Section E}                               
Class C:    {Section F, Prem 2, Prem 3}                             

价值是每月花费的小时数。

我需要将每个班级的总小时数与高级班级以及所取得的高级班级数量分开。

因此上述数据的预期输出为:

Premiums : { Prem 1, Prem 2, Prem 3}

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我认为输入是dictionaries of list s:

d1 = {'Class A' :   ['Section A', 'Section B', 'Prem 1'],                             
     'Class B' :   ['Section C', 'Section D', 'Section E'],                              
     'Class C':    ['Section F', 'Prem 2', 'Prem 3']}

d2 = {'Premiums' : ['Prem 1', 'Prem 2', 'Prem 3']} 

使用键交换列表的值并过滤掉第一个词典的Prem值:

d11 = {k: oldk for oldk, oldv in d1.items() for k in oldv if not 'Prem' in k} 
d21 = {k: oldk for oldk, oldv in d2.items() for k in oldv}      

加入词典:

d3 = {**d11, **d21}

按列分组,包含最终字典和汇总sum

df1 = df.groupby(d3, axis=1).sum()

上次为非0计数列添加列:

df1['no_of_prem']= df[['Prem 1','Prem 2','Prem 3']].ne(0).sum(axis=1)
print (df1)
   Class A  Class B  Class C  Premiums  no_of_prem
0       12       25       45        21           2
1       28       73       24        35           3
2       43       46       17        20           1
3       37       58        4        54           3
4       37       20       14        48           3

另一个解决方案是从tuple创建dictinaries,将它们连接在一起:

L1 = [(oldk, k) for oldk, oldv in d1.items() for k in oldv if not 'Prem' in k] 
L2 = [(oldk, k) for oldk, oldv in d2.items() for k in oldv] 

然后按MultiIndex.from_tuplesreindex列创建MultiIndex,用于汇总sum的第一级:

mux = pd.MultiIndex.from_tuples(L1 + L2)
df1 = df.reindex(columns=mux, level=1).sum(level=0, axis=1)
df1['no_of_prem']= df[['Prem 1','Prem 2','Prem 3']].ne(0).sum(axis=1)
print (df1)
   Class B  Class C  Class A  Premiums  no_of_prem
0       25       45       12        21           2
1       73       24       28        35           3
2       46       17       43        20           1
3       58        4       37        54           3
4       20       14       37        48           3

答案 1 :(得分:0)

您可以使用apply直接添加小时数。

df['prem_no']=df.apply(lambda x : (x['prem1']+x['prem2']+x['prem3']), axis=1)

要计算没有保费,您可以使用

df['no_of_prem']= (df[['prem1','prem2','prem3']] !=0 ).astype(int).sum(axis=1)