将多列中的值汇总到字典中定义的组中

时间:2018-01-01 08:50:36

标签: python pandas dictionary

我的设备数据分布在不同的通道上,通道分为3个独立的组,由字典定义。现在,我需要将数据列的总和分为3个单独的组。

输入

device_id   class   Channel A   Channel B   Channel C   Channel D   Channel E   Channel F   Channel G   Channel H   Channel I   Channel J
28          S           2           4           23          45          6           6           8           9           0           0
54          P           0           0           0           0           0           0           0           0           0           0
97          S           0           0           0           0           0           0           0           0           0           0
14          V           0           0           0           0           0           0           0           0           0           0
21          P           0           0           0           0           0           0           0           0           0           0
23          V           0           0           0           0           0           0           0           0           0           0
22          P           0           0           32          76          89          0           0           0           0           0
29          P           0           0           0           0           0           0           0           0           0           0
25          S           0           0           0           0           0           0           0           0           0           0
27          P           0           0           0           0           0           0           0           0           0           0

所以根据问题的描述预期输出:

预期输出

device_id   S   P   V
28          6   74  23
54          0   0   0
97          0   0   0
14          0   0   0
21          0   0   0
23          0   0   0
22          0   197 0
29          0   0   0
25          0   0   0
27          0   0   0

包含映射的字典是:

字典

{               
'S' : ['Channel A','Channel B'],                
'P' : ['Channel C','Channel D','Channel E'],                
'V' : ['Channel F','Channel G','Channel H','Channel I',' Channel J']
}

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

首先,展平并反转您的映射 -

m = {j : k for k, v in d.items() for j in v}
m

{'Channel A': 'S',
 'Channel B': 'S',
 'Channel C': 'P',
 'Channel D': 'P',
 'Channel E': 'P',
 'Channel F': 'V',
 'Channel G': 'V',
 'Channel H': 'V',
 'Channel I': 'V',
 'Channel J': 'V'}

现在,我们将执行以下操作 -

  • set_indexdevice_id
  • 使用class摆脱drop(因为我们不需要)
  • 使用之前生成的映射对列名执行rename操作
  • 对名称相同的列执行groupby,汇总列

df.set_index('device_id')\
  .drop('class', 1)\
  .rename(columns=m)\
  .groupby(axis=1, level=0, sort=False)\
  .sum()

           S    P   V
device_id            
28         6   74  23
54         0    0   0
97         0    0   0
14         0    0   0
21         0    0   0
23         0    0   0
22         0  197   0
29         0    0   0
25         0    0   0
27         0    0   0