Pandas groupby date - периоды определенной даты - PullRequest
0 голосов
/ 02 февраля 2019

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

Мои данные выглядят примерно так:

df = pd.DataFrame({
"USER_ID": ["AA1", "AB1", "AA3", "CD3", "AB4", "AA1", "AA1", "AA3", "AB4", "AB4"],
"ACTIVITY_CATEGORY": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"DATE": ['2018-09-19', '2018-09-13', '2018-09-06', '2018-09-18', '2018-09-15', '2018-09-19', '2018-09-16', '2018-09-06', '2018-09-04', '2018-09-04']})

Итак, я обычно делаю это следующим образом:

df.groupby(['USER_ID',pd.Grouper(key='DATE', freq='W')])['ACTIVITY_CATEGORY'].count()

Но сейчас я хочу получить его на определенную неделю.По сути, возможность получить что-то более похожее на:

enter image description here

Я прочитал документацию по различным способам группировки в Grouper - и смещения, которые можно использовать.До сих пор не могу найти что-то подобное.

Существует довольно громоздкий способ сделать это, используя цикл for и используя timedelta и вычитая 7 дней с последнего дня, но это очень неэффективно для большого набора данных.В поисках более питонического пути.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

IIUC, вы можете попробовать это:

df_new=df.groupby(['USER_ID',pd.Grouper(key='DATE', freq='W')])['ACTIVITY_CATEGORY']\
.count().reset_index()
df_new['week_num']=(df_new.DATE.dt.day//7)+1
print(df_new.pivot_table(index='USER_ID',columns=['week_num']).fillna(0))

            ACTIVITY_CATEGORY          
week_num                 2    3    4
USER_ID                             
AA1                    0.0  1.0  2.0
AA3                    2.0  0.0  0.0
AB1                    0.0  1.0  0.0
AB4                    2.0  1.0  0.0
CD3                    0.0  0.0  1.0

Если присутствует неделя 1, она должна автоматически заполниться.

0 голосов
/ 02 февраля 2019

это похоже на то, что вы пытаетесь достичь

df['DATE'] = 'WEEK ' + pd.to_numeric(pd.to_datetime(df['DATE']).dt.day/7).apply(math.ceil).apply(str)
df.pivot_table(index=['USER_ID'],columns=['DATE'],aggfunc='count').fillna(0)

Out:

         ACTIVITY_CATEGORY
DATE    WEEK 1  WEEK 2  WEEK 3
USER_ID         
AA1     0.0     0.0     3.0
AA3     2.0     0.0     0.0
AB1     0.0     1.0     0.0
AB4     2.0     0.0     1.0
CD3     0.0     0.0     1.0
...