我有以下数据:
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 34 56 21 0 76 45 0 0 0 0
97 S 24 45 76 0 0 35 76 87 6 20
22 V 0 0 32 76 89 0 0 0 0 0
channel 按照我在字典中定义的映射分组出现,如下所示:
字典:
di = {
'S' : ['Channel A','Channel B'],
'P' : ['Channel C','Channel D','Channel E'],
'V' : ['Channel F','Channel G','Channel H','Channel I',' Channel J']
}
我需要从 pandas 数据帧中按行计算每个设备下正在观看的 channel 数量。
预期输出:
device_id class Channels_S Channels_P Channels_V
28 S 2 3 3
54 P 2 2 1
97 S 2 1 5
22 V 0 3 0
有人可以指导我吗?
最佳答案
这里有一个你可以使用的技巧:
mask = df.set_index(['device_id','class']) != 0
d1 = mask.groupby({i:k for k,v in di.items() for i in v},axis=1).sum()
ndf = d1.add_prefix('Channel_').reset_index()
device_id class Channel_P Channel_S Channel_V
0 28 S 3.0 2.0 3.0
1 54 P 2.0 2.0 1.0
2 97 S 1.0 2.0 5.0
3 22 V 3.0 0.0 0.0
说明:
mask
将为您提供一个带有 bool 值的数据帧,其值不等于零为真,其余为假。我们将设备和类别设置为索引,因此不会考虑它们。展开字典内的列表,以便我们可以根据键对列进行分组
{i:k for k,v in di.items() for i in v}
{ 'Channel_F': 'V', 'Channel_J': 'V', 'Channel_E': 'P',
'Channel_G': 'V', 'Channel_D': 'P', 'Channel_B': 'S',
'Channel_I': 'V', 'Channel_A': 'S', 'Channel_C': 'P',
'Channel_H': 'V' }
按轴 1 分组,然后求和。
向列添加前缀并重置索引。
关于python - 如何获取 pandas 数据框中值按行不为零的列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48144466/