Как рассчитывать по частоте времени, используя groupby - pandas - PullRequest
2 голосов
/ 10 октября 2019

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

Я пытался адаптировать свой код с помощью ответов на вопросы SO:

, но, кажется, не получается заставить команду работать, когда я ввожу freq='day' в команде groupby.

Мой код:

print(df.groupby(['Priority', 'Create Time']).Priority.count())

который первоначально выдает что-то вроде 170000, приводит к следующей структуре:

Priority  Create Time        
1.0       2011-01-01 00:00:00    1
          2011-01-01 00:01:11    1
          2011-01-01 00:02:10    1
                  ...

2.0       2011-01-01 00:01:25    1
          2011-01-01 00:01:35    1
                  ...

Но теперь по какой-то причине (я использую Jupyter Notebook) он производит только:

Priority  Create Time        
1.0       2011-01-01 00:00:00    1
          2011-01-01 00:01:11    1
          2011-01-01 00:02:10    1
2.0       2011-01-01 00:01:25    1
          2011-01-01 00:01:35    1
Name: Priority, dtype: int64

Не знаю, почему результат изменился только на 5 результатов (может быть, я неосознанно что-то изменил).

Я бы хотел, чтобы результаты были в следующем формате:

Priority  month     Count     
1.0       2011-01     a
          2011-02     b
          2011-03     c
                ...

2.0       2011-01     x
          2011-02     y
          2011-03     z
                ...

Верхние баллы за показкак правильно изменить частоту для других значений, напримерhour/day/month/year. С ответами, пожалуйста, не могли бы вы объяснить, что происходит в вашем коде, так как я новичок и изучаю панд и хочу понять процесс. Спасибо.

1 Ответ

2 голосов
/ 10 октября 2019

Одним из возможных решений является преобразование столбца даты и времени в месячные периоды на Series.dt.to_period:

print(df.groupby(['Priority', df['Create Time'].dt.to_period('m')]).Priority.count())

Или используйте Grouper:

print(df.groupby(['Priority', pd.Grouper(key='Create Time', freq='MS')]).Priority.count())

Образец :

np.random.seed(123)

df = pd.DataFrame({'Create Time':pd.date_range('2019-01-01', freq='10D', periods=10),
                   'Priority':np.random.choice([0,1], size=10)})

print (df)
  Create Time  Priority
0  2019-01-01         0
1  2019-01-11         1
2  2019-01-21         0
3  2019-01-31         0
4  2019-02-10         0
5  2019-02-20         0
6  2019-03-02         0
7  2019-03-12         1
8  2019-03-22         1
9  2019-04-01         0

print(df.groupby(['Priority', df['Create Time'].dt.to_period('m')]).Priority.count())
Priority  Create Time
0         2019-01        3
          2019-02        2
          2019-03        1
          2019-04        1
1         2019-01        1
          2019-03        2
Name: Priority, dtype: int64

print(df.groupby(['Priority', pd.Grouper(key='Create Time', freq='MS')]).Priority.count())
Priority  Create Time
0         2019-01-01     3
          2019-02-01     2
          2019-03-01     1
          2019-04-01     1
1         2019-01-01     1
          2019-03-01     2
Name: Priority, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...