我的设备数据分布在不同的通道上,通道分为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']
}
有人可以帮帮我吗?
答案 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_index
与device_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