使用pandas数据帧groupby中的计数提取新列

时间:2017-08-31 03:40:10

标签: python pandas group-by

我正在处理像这样的pandas数据框:

     Day  Hour         Prio  Value
0      1     6     Critical      1
1      1    16     Critical      1
2      1    17      Content      1
3      1    17          Low      1
6      1    19     Critical      1
7      1    20         High      1
8      2    10         High      1
9      2    10          Low      2

现在我希望按天和小时进行分组,同时生成代表Prio列中每个值的计数的新列,这些列当前存在于value列中。所以我想实现这个结构:

     Day  Hour  Critical  Content  Low  High
0      1     6         1        0    0     0
1      1    16         1        0    0     0
2      1    17         0        1    1     0
6      1    19         1        0    0     0
7      1    20         0        0    0     1
8      2    10         0        0    2     1

我现在尝试了不同的东西,但并没有相当成功。我的目标是将此数据框与按日和小时包含其他列的另一个数据框合并,以便进一步聚合它们。特别是我需要优先级中每天/每小时的百分比份额(至少有一个非零值始终存在)。

在过去的解决方案中,我在每行迭代以提取单个值,但这一点相当慢。我希望尽可能保持高效,因为数据应该在散景服务器应用程序中实时更新。也许有一个解决方案没有使用itertuples或类似的东西?谢谢!

3 个答案:

答案 0 :(得分:2)

df.groupby(['Day','Hour','Prio']).sum().unstack().fillna(0).astype(int)
#           Value                  
#Prio     Content Critical High Low
#Day Hour                          
#1   6          0        1    0   0
#    16         0        1    0   0
#    17         1        0    0   1
#    19         0        1    0   0
#    20         0        0    1   0
#2   10         0        0    1   2

如果需要,您可以进一步重置索引。

答案 1 :(得分:2)

或者你可以尝试

pd.pivot_table(df,values='Value',index=['Day','Hour'],columns=['Prio'],aggfunc='sum')\
     .fillna(0).astype(int)


Out[22]: 
Prio      Content  Critical  High  Low
Day Hour                              
1   6           0         1     0    0
    16          0         1     0    0
    17          1         0     0    1
    19          0         1     0    0
    20          0         0     1    0
2   10          0         0     1    2

答案 2 :(得分:1)

让我们使用set_indexunstackreset_indexrename_axis

df.set_index(['Day','Hour','Prio'])['Value']\
  .unstack().fillna(0)\
  .astype(int).reset_index()\
  .rename_axis(None,1)

输出:

   Day  Hour  Content  Critical  High  Low
0    1     6        0         1     0    0
1    1    16        0         1     0    0
2    1    17        1         0     0    1
3    1    19        0         1     0    0
4    1    20        0         0     1    0
5    2    10        0         0     1    2