【问题标题】:pandas count total of last 7 days but varying dates across groupbypandas 统计过去 7 天的总数,但 groupby 的日期不同
【发布时间】:2020-11-09 04:43:32
【问题描述】:

我有这个数据框:

    date        state   cases flag
0   2020-03-13  Alabama 6     0
1   2020-03-14  Alabama 12    0
2   2020-03-15  Alabama 23    0
3   2020-03-16  Alabama 29    1
4   2020-03-17  Alabama 39    0

我想从标志列 = 1 的日期算起过去 7 天的案例数。我尝试了对找到的其他答案的一些变体 here 没有运气。我有多个州的数据,需要按州分组。

输出应如下所示:

state     count
Alabama   70

【问题讨论】:

  • 请添加您尝试过的内容,以便用户评论问题所在并提供建议。

标签: python pandas date


【解决方案1】:

您需要 7 天的滚动总和(假设我们有所有州所有天的数据):

res_df = df[['state', 'cases']].groupby('state')['cases'].apply(lambda x: x.rolling(7, 1).sum().iloc[-1])
print(res_df)

【讨论】:

    【解决方案2】:

    很难从这个问题中分辨出来,因为它很不清楚,但也许可以尝试:

    df.groupby('State').rolling(7).count()

    【讨论】:

    • 如果数据框中有非数字列,这可能会失败
    【解决方案3】:

    我注意到 flag 列仅在一行中包含 1(在每个状态中)。

    因此,对于当前状态,正确的算法是:

    • 找到日期,其中标志== 1(标志日期),
    • 查找早于 7 天的日期(开始日期),
    • 获取这些日期之间的行并对 cases 列求和。

    要生成您的预期结果,请定义以下函数:

    def sumCases(grp):
        dFlag = grp[grp.flag == 1].iloc[0,0]
        dStart = dFlag - pd.Timedelta('7d')
        return grp[grp.date.between(dStart, dFlag)].cases.sum()
    

    然后应用它:

    result = df.groupby('state').apply(sumCases)
    

    但如果任何状态可以有 多个flag == 1, 需要另一种方法。

    将求和函数定义为:

    def sumCases2(grp):
        flagDate = grp[grp.flag == 1].date
        ind = [ pd.date_range(dd - pd.Timedelta('7d'), dd).to_series() for dd in flagDate ]
        return grp[grp.date.isin(pd.concat(ind).unique())].cases.sum()
    

    然后应用它:

    result = df.groupby('state').apply(sumCases2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多