Python 如何获取数据帧中值不是零行的列数计数

Python 如何获取数据帧中值不是零行的列数计数,python,pandas,count,Python,Pandas,Count,我有以下数据: 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

我有以下数据:

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
根据我在字典中定义的映射,通道成组出现,如下所示:

字典:

di = {              
'S' : ['Channel A','Channel B'],                
'P' : ['Channel C','Channel D','Channel E'],                
'V' : ['Channel F','Channel G','Channel H','Channel I',' Channel J']
}
我需要从熊猫数据帧按行计算每个设备下观看的频道数

预期产出:

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
    将为您提供一个数据帧,其中布尔值不等于零true,其余为false。我们将设备和类设置为索引,因此不会考虑它们

  • 展开dict中的列表,以便我们可以根据键
    {i:k代表k,v在di.items()代表i在v}

  • 按轴1分组,然后求和

  • 向列添加前缀并重置索引


  • 令人惊叹的。谢谢!Shuvayan Das我很高兴,如果它很好,别忘了向上投票。@Dark抱歉,但是
    di
    属于哪个目录?我没有看到任何
    di
    dict要在上面应用
    di.items()
    ?@ChihebNexus Op没有给他的dict命名,所以我想到了一个名字。好吧:-)我现在明白了。顺便说一句,回答得很好。
    
        { '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' }