【问题标题】:group by the count of how many successive days per id in pandas按 pandas 中每个 id 连续天数分组
【发布时间】:2019-08-12 04:38:27
【问题描述】:

如果我有一个如下所示的 pandas df:

df = pd.DataFrame({ "id":[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4],
     "date":("2000-07-06","2000-07-07","2000-07-08","2000-07-09","2000-07-10","2000-07-06","2000-07-10","2000-07-11","2000-07-17","2000-07-20","2000-07-06","2000-07-07","2000-07-08","2000-07-10","2000-07-15","2000-07-16","2000-07-25","2000-07-11","2000-07-20")})
df.date =pd.to_datetime(df.date)

         date     id
1   2000-07-06     1
2   2000-07-07     1
3   2000-07-08     1
4   2000-07-09     1
5   2000-07-10     1
6   2000-07-06     2
7   2000-07-10     2
8   2000-07-11     2
9   2000-07-17     2
10  2000-07-20     2
11  2000-07-06     3
12  2000-07-07     3
13  2000-07-08     3
14  2000-07-10     3
15  2000-07-15     3
16  2000-07-16     3
17  2000-07-25     3
18  2000-07-11     4
19  2000-07-20     4

我想按 id 分组,但计算每个 id 连续几天有多少次,以便期待这样的事情:

   count     id
1    4        1
2    1        2
3    3        3
3    0        4

我不知道构建循环是否是最佳选择,但我想知道是否有人知道快速方法或可以做到这一点的函数。谢谢

【问题讨论】:

  • 始终将 pandas 标签添加到 pandas 问题。您的问题将得到更快的答复

标签: python-3.x pandas time


【解决方案1】:

您可以使用pandas.core.groupby.DataFrameGroupBy.diff 并有条件地填写10,如果差值是1 daynp.where。之后总和1's

df['diff'] = np.where(df.groupby('id')['date'].diff() == '1 days', 1, 0)

df_grouped = df.groupby('id').diff.sum()

输出

print(df_grouped.reset_index().rename({'diff':'count'}, axis=1))
   id  count
0   1      4
1   2      1
2   3      3
3   4      0

或者你可以使用.agg:

df_grouped2 = df.groupby('id').agg({'diff':'sum'})

print(df_grouped2.reset_index().rename({'diff':'count'}, axis=1))
   id  count
0   1      4
1   2      1
2   3      3
3   4      0

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2016-11-03
    • 2018-08-04
    • 2020-05-18
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多