python - 如何获取 pandas 数据框中值按行不为零的列数

标签 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           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

说明:

  1. mask 将为您提供一个带有 bool 值的数据帧,其值不等于零为真,其余为假。我们将设备和类别设置为索引,因此不会考虑它们。

  2. 展开字典内的列表,以便我们可以根据键对列进行分组{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/

    相关文章:

    python - 满足列条件后,Pandas 截断 DataFrame

    python - 如何从带有附加分隔符的 csv 在 python 中创建 pandas 数据框?

    mysql - 在 MySQL 中一起使用 Distinct、Count 和 Group

    python - 不使用 SET 的两个字符串列表之间的区别

    python - 需要从字典列表中删除重复项并更改剩余重复项的数据(python)

    python - 如何从 Tkinter 中的条目获取输入以用于另一个窗口中使用的函数?

    python - 如何在长 Pandas 系列上应用三次样条插值?

    python - Pandas 中的 for 循环真的很糟糕吗?我什么时候应该关心?

    Javascript 如果字符串中的字符出现次数相同

    mysql - 如何在 select 语句中使用嵌套 select 执行计数