Groupby с суммой по столбцам, чтобы получить частоту каждого элемента с помощью pandas

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

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

  1. Общее количество дней для каждого идентификатора и
  2. частота каждого дня для каждого идентификатора.

Так что это должно выглядеть так:

мои данные

Кроме того, я попробовал следующее:

 number = data.groupby(by=['ID, Date_Time']).size().unstack(fill_value=0) 
  

но это дает мне другой фрейм данных, который я не могу добавить к оригиналу в разделе «данные».

Комментарии:

1. Пожалуйста, предоставьте образец воспроизводимого кода для включения ввода, не вставляйте изображения

Ответ №1:

Я создал простой образец данных, поскольку вы предоставили только скриншот, вам нужно преобразовать дату в формат datetime, а затем сгруппировать по идентификатору и pd.Grouper по отдельным дням (D). Для итога все, что вам нужно groupby , это преобразовать количество каждой группы.

 data = [[1, "2010-01-01 12:21:46"],[1, "2010-01-01 12:22:46"],[1, "2010-04-02 12:21:46"],[1, "2010-06-06 12:21:46"],[2, "2010-06-06 12:21:46"],[2, "2010-06-06 19:21:46"],[2, "2010-09-06 12:21:46"]]

import pandas as pd 

df = pd.DataFrame(data,columns=("id","date_"))
df['date_']= pd.to_datetime(df['date_'],format='%Y-%m-%d %H:%M:%S')
df['freq'] = df.groupby(['id', pd.Grouper(key='date_', freq='D')])['id'].transform('count')
df['total'] = df.groupby('id')['id'].transform('count')
  

Окончательный вывод вывода будет выглядеть следующим образом:

    id               date_  freq  total
0   1 2010-01-01 12:21:46     2      4
1   1 2010-01-01 12:22:46     2      4
2   1 2010-04-02 12:21:46     1      4
3   1 2010-06-06 12:21:46     1      4
4   2 2010-06-06 12:21:46     2      3
5   2 2010-06-06 19:21:46     2      3
6   2 2010-09-06 12:21:46     1      3