我的设备数据分布在各个 channel 中,这些 channel 分为 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']
}
有人可以帮我解决这个问题吗?
最佳答案
首先,展平并反转您的映射 -
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
- 使用
drop
摆脱class
(因为我们不需要它) - 使用之前生成的映射对列名执行
重命名
操作 - 对同名列执行
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
关于python - 将多列中的值汇总到字典中定义的组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048322/