【问题标题】:count number of consecutive dates and group by ID计算连续日期的数量并按 ID 分组
【发布时间】:2023-01-17 22:34:08
【问题描述】:

我有一个关于用户活动的数据框,如下所示:


| ID     |  week| date    | 
|------- |------| ------- |
| 1      | 1    | 20/07/22| 
| 1      | 2    | 28/07/22| 
| 1      | 2    | 30/07/22| 
| 1      | 3    | 04/08/22| 
| 1      | 3    | 05/08/22| 
| 2      | 2    | 26/07/22| 
| 2      | 2    | 27/07/22| 
| 2      | 3    | 04/08/22|

我需要找到每周每个 ID 的连续日期总和,因此输出将如下所示 - 这样每个 ID 每周一行:

| ID     | week | count_consecutive | 
|------- |------| ----------------- |
| 1      | 1    | 0                 | 
| 1      | 2    | 0                 | 
| 1      | 3    | 2                 | 
| 2      | 2    | 2                 | 
| 2      | 3    | 0                 |

知道怎么做吗?

谢谢!!

【问题讨论】:

  • 你能发布代码吗
  • 你确定输出应该是你给的吗?

标签: python pandas


【解决方案1】:

您可以使用 groupbyapply 自定义函数:

# You can replace .eq(pd.Timedelta(days=1)) by .eq('1D'), enhanced by @mozway
consecutive_days = lambda x: x.diff().eq(pd.Timedelta(days=1)).sum() + 1

out = (df.groupby(['ID', 'week'])['date']
         .apply(consecutive_days)
         .where(lambda x: x > 1, other=0)
         .rename('count_consecutive').reset_index())

print(out)

# Output
   ID  week  count_consecutive
0   1     1                  0
1   1     2                  0
2   1     3                  2
3   2     2                  2
4   2     3                  0

这里的问题是您使用的逻辑:如果没有连续的一天则为 0,如果有连续的一天则为 2。所以在结果中,它不能有 1。

【讨论】:

  • 谢谢你。我没有发现我的逻辑有问题——没有连续 1 天的事情,要么根本不连续,要么至少连续 2 天。
  • 您还可以使用字符串进行时间增量比较.eq('1D')
  • 哦!我对此一无所知!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多