#python #pandas
#python #панды
Вопрос:
Хотел бы знать, как я могу определить последовательные периоды дат с помощью сброса счетчика периодов для каждой группы.
Это моя попытка сделать это по всему фрейму данных, но я не могу понять, как это сделать для каждой группы.
import pandas as pd
data = {
"peoples": ["jimbob","jimbob","jimbob", "jimbob","jimbob","jimbob", "sonnyjim","sonnyjim","sonnyjim","sonnyjim"],
"dates": ["2020-11-01","2020-11-02","2020-11-03","2020-11-06","2020-11-09","2020-11-10", "2020-11-12","2020-11-13","2020-11-20","2020-11-22"]
}
df = pd.DataFrame(data)
df["dates"] = pd.to_datetime(df["dates"])
df["period"] = df["dates"].diff().dt.days.ne(1).cumsum()
print(df)
Я хотел бы иметь возможность сделать что-то вроде этого:
peoples dates period
0 jimbob 2020-11-01 1
1 jimbob 2020-11-02 1
2 jimbob 2020-11-03 1
3 jimbob 2020-11-06 2
4 jimbob 2020-11-09 3
5 jimbob 2020-11-10 3
6 sonnyjim 2020-11-12 1
7 sonnyjim 2020-11-13 1
8 sonnyjim 2020-11-20 2
9 sonnyjim 2020-11-22 3
Ответ №1:
Вы можете groupby
включить peoples
фрейм данных, а затем применить пользовательскую lambda
функцию dates
для вычисления последовательных блоков дат:
f = lambda s: s.diff().dt.days.ne(1).cumsum()
df['period'] = df.groupby('peoples')['dates'].apply(f)
peoples dates period
0 jimbob 2020-11-01 1
1 jimbob 2020-11-02 1
2 jimbob 2020-11-03 1
3 jimbob 2020-11-06 2
4 jimbob 2020-11-09 3
5 jimbob 2020-11-10 3
6 sonnyjim 2020-11-12 1
7 sonnyjim 2020-11-13 1
8 sonnyjim 2020-11-20 2
9 sonnyjim 2020-11-22 3