GroupBy 每周在熊猫中与其他列一起计数

Posted

技术标签:

【中文标题】GroupBy 每周在熊猫中与其他列一起计数【英文标题】:GroupBy count on weekly in pandas with other columns 【发布时间】:2020-01-29 18:16:24 【问题描述】:

我有一个如下图所示的df,这是一个地区的事故记录。

Sector   RaisedDate   Inspector_ID    Priority  
SE1      02-Aug-2019  ID1             High
SE2      04-Aug-2019  ID1             Low
SE2      06-Aug-2019  ID2             Medium
SE1      12-Aug-2019  ID1             High
SE2      11-Aug-2019  ID1             Low
SE1      13-Aug-2019  ID2             High
SE1      18-Aug-2019  ID1             Medium
SE2      21-Aug-2019  ID1             Medium
SE2      20-Aug-2019  ID2             High
SE1      23-Aug-2019  ID1             High
SE1      25-Aug-2019  ID1             Low
SE2      29-Aug-2019  ID2             High
SE1      25-Aug-2019  ID1             Low
SE1      25-Aug-2019  ID2             High

从上面我想准备下面的数据框

Sector  #_Week1  #_Week2  #_Week3  #_Week4   #_Week5   No_of_High   No_of_low
SE1     1        2        1        4         0         5            2
SE2     2        1        2        0         1         2            2        

其中 #_Week1 = 第 1 周(包括 2019 年 8 月 1 日至 2019 年 8 月 7 日)登记的事故数量

#_Week2 = 第 2 周登记的事故数量(包括 2019 年 8 月 8 日至 2019 年 8 月 14 日)

#_Week3 = 第 3 周登记的事故数量(包括 2019 年 8 月 15 日至 2019 年 8 月 21 日)

#_Week4 = 第 4 周(包括 2019 年 8 月 22 日至 2019 年 8 月 28 日)登记的事故数量

#_Week5 = 第 3 周(包括 2019 年 8 月 29 日至 2019 年 8 月 31 日)登记的事故数量

No_of_High = 所有数据中该扇区的高优先级事故总数。

No_of_Low = 所有数据中该扇区的低优先级事故总数。

为此,我尝试了以下代码但不起作用

df.set_index('RaisedDate').groupby(pd.Grouper(freq='Weekly')).Sector.count()

【问题讨论】:

这不行吗?你哪里错了? Weekly 在参数中是不可接受的。试试'7D' 看看它是否有效。 您的数据从 2019 年 8 月 2 日开始。有理由在Aug-01 上开始分组吗? 【参考方案1】:

使用@Parth 所说的并将"Sector" 添加到groupby()

print(df.set_index('RaisedDate').groupby([
    'Sector',
    pd.Grouper(freq='7D'),
]).Sector.count().unstack())

RaisedDate  2019-08-02  2019-08-09  2019-08-16  2019-08-23
Sector                                                    
SE1                  1           2           1           4
SE2                  2           1           2           1

让你更接近你想要的。然后,您可以重命名列以匹配您的输出。

我还注意到我在第 4 周有值 41,但没有第 5 周。不确定这对您来说是否有问题?


要添加高/低优先级列,您可以加入具有不同组的新数据框。

# store the weekly groups
date = df.groupby([
    'Sector',
    pd.Grouper(key='RaisedDate', freq='7D')
]).Sector.count().unstack()


# rename columns
date.columns = [f'weeki' for i in range(1, len(date.columns)+1)]

# store the priority groups
prio = (df.groupby([
    'Sector',
    'Priority'
]).Priority.count().unstack().drop(columns=[
    'Medium',
]))

# join them
print(date.join(prio))

        week1  week2  week3  week4  High  Low
Sector                                       
SE1         1      2      1      4     5    2
SE2         2      1      2      1     2    2

【讨论】:

以上是关于GroupBy 每周在熊猫中与其他列一起计数的主要内容,如果未能解决你的问题,请参考以下文章

Groupby - 具有重复值的熊猫 df 计数

Groupby 并根据熊猫数据框中的其他列比较/过滤特定组

大熊猫分类变量的百分比计数

如何调试熊猫 groupby 应用功能

Python - 熊猫,分组和最大计数

当计数为零时熊猫 groupby 以及如何在结果中包含零值