сгруппировать по количеству последовательных дней на ID в пандах - PullRequest
1 голос
/ 21 марта 2019

Если у меня есть 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

, и я хотел бы сгруппировать по идентификатору, но посчитав, сколько раз было последовательных дней для каждого идентификатора, чтобы ожидать чего-товот так:

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

Я не знаю, будет ли построение цикла лучшим вариантом, но я хотел бы знать, знает ли кто-нибудь быстрый подход или функцию, которая может это сделать.Спасибо

1 Ответ

3 голосов
/ 21 марта 2019

Вы можете сделать pandas.core.groupby.DataFrameGroupBy.diff и условно заполнить 1 или 0, если разница составляет 1 day с np.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...