2016-12-06 2 views
1

У меня dataframe который выглядит следующим образом:панды DataFrame интерполирующая/передискретизации ежедневные данные на погруппно

userid  date   count 
a   2016-12-01 4 
a   2016-12-03 5 
a   2016-12-05 1 
b   2016-11-17 14 
b   2016-11-18 15 
b   2016-11-23 4 

Первый столбец представляет собой идентификатор пользователя, второй столбец даты (в результате из группы (pd.TimeGrouper ('d')), а третий столбец - ежедневный счет. Однако для пользователя я хотел бы убедиться, что любые дни, отсутствующие между минимальной и максимальной датой пользователя, заполняются, чтобы быть 0 . на каждого пользователя Так что, если я начинаю с кадра данных, как выше, я в конечном итоге с кадра данных, как это:

userid  date   count 
    a   2016-12-01 4 
    a   2016-12-02 0 
    a   2016-12-03 5 
    a   2016-12-04 0 
    a   2016-12-05 1 
    b   2016-11-17 14 
    b   2016-11-18 15 
    b   2016-11-19 0 
    b   2016-11-20 0 
    b   2016-11-21 0 
    b   2016-11-22 0 
    b   2016-11-23 4 

Я знаю, что существуют различные методы, доступные с рамкой данных pandas для повторной выборки (с возможностью выбора для интерполяции вперед, назад или путем усреднения), но как бы я сделал это в указанном выше смысле, где я хочу непрерывный временной ряд для каждый userid, но где даты временного ряда разные для каждого пользователя?

Вот что я пытался, что не работал:

grouped_users = user_daily_counts.groupby('user').set_index('timestamp').resample('d', fill_method = None)

Однако это выдает ошибку AttributeError: Cannot access callable attribute 'set_index' of 'DataFrameGroupBy' objects, try using the 'apply' method. Я не уверен, как я смогу использовать метод apply, показывая все столбцы, как хотелось бы.

Спасибо за любые предложения!

ответ

3

Вы можете использовать groupby с resample, но сначала необходимо Datetimeindex созданное set_index.
(need pandas 0.18.1 and higher)

Залейте NaN по 0 по asfreq с fillna.

Последняя колонка удалить userid и reset_index:

df = df.set_index('date') 
     .groupby('userid') 
     .resample('D') 
     .asfreq() 
     .fillna(0) 
     .drop('userid', axis=1) 
     .reset_index() 

print (df) 
    userid  date count 
0  a 2016-12-01 4.0 
1  a 2016-12-02 0.0 
2  a 2016-12-03 5.0 
3  a 2016-12-04 0.0 
4  a 2016-12-05 1.0 
5  b 2016-11-17 14.0 
6  b 2016-11-18 15.0 
7  b 2016-11-19 0.0 
8  b 2016-11-20 0.0 
9  b 2016-11-21 0.0 
10  b 2016-11-22 0.0 
11  b 2016-11-23 4.0 

Если хочет DTYPE колонок count целого добавить astype:

df = df.set_index('date') \ 
     .groupby('userid') \ 
     .resample('D') \ 
     .asfreq() \ 
     .fillna(0) \ 
     .drop('userid', axis=1) \ 
     .astype(int) \ 
     .reset_index() 

print (df) 
    userid  date count 
0  a 2016-12-01  4 
1  a 2016-12-02  0 
2  a 2016-12-03  5 
3  a 2016-12-04  0 
4  a 2016-12-05  1 
5  b 2016-11-17  14 
6  b 2016-11-18  15 
7  b 2016-11-19  0 
8  b 2016-11-20  0 
9  b 2016-11-21  0 
10  b 2016-11-22  0 
11  b 2016-11-23  4 
+0

Спасибо! Я не думал о переупорядочивании set_index, и действительно, это всегда меня смущает в том смысле, что существуют повторяющиеся даты, но каким-то образом их устанавливают, поскольку индекс все еще работает? – helloB

+0

Да, но он должен быть уникальным для каждой группы. Спасибо, что согласились. – jezrael

Смежные вопросы