在python中从两个单独的字典创建摘要数据

2024-05-29 08:49:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框中的以下数据,其中每个部分属于一个类,而且学生可以单独或作为一个类包括一些高级课程。你知道吗

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

我有两本字典: 舱位:包括舱位和保险费,作为包装的一部分。你知道吗

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}

这些值是每月花费的小时数。你知道吗

我需要找出每节课的总课时,分别从高级课程,以及采取的高级课程的数量。你知道吗

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

student_id  Class A Class B Class C Premium Number of Premium
1               12      25      45      21      2
2               28      73      24      35      3
3               43      46      17      22      2
4               37      58      4       54      3
5               37      20      14      48      3

有人能帮我吗?你知道吗


Tags: 数据id字典sectionstudent学生class课程
2条回答

您可以使用“应用”直接添加小时数。你知道吗

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)

我相信输入是dictionaries of list

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']} 

用键交换列表的值并筛选出第一个dict的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

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

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

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

相关问题 更多 >

    热门问题