У меня есть фрейм данных с данными из нескольких супермаркетов со следующей структурой:
MARKET_ID SECTOR DATE HOUR REVENUE COUPONS ITEMS
328 21 Fruits 2019-02-24 15:00:00 808.60 19 29
329 21 Fruits 2019-02-24 22:00:00 267.54 8 8
330 21 Fruits 2019-02-26 17:00:00 350.89 10 14
331 21 Dairy 2019-02-26 07:00:00 72.89 2 2
332 21 Dairy 2019-03-03 15:00:00 122.69 4 4
Некоторые примечания:
[HOUR]
идет от «00:00:00» до «23:00:00» (24 записи за дату).
Мой «составной ключ» будет комбинацией [MARKET_ID]
,
[SECTOR]
, [DATE]
и [HOUR]
, но я не использую MultiIndex в этом кадре данных.
Часы без продаж (доход, купоны или товары) не отображаются как строки в данных, которые я получаю.
Я хотел бы заполнить эти недостающие строки в моем кадре данных, например, ниже:
MARKET_ID SECTOR DATE HOUR REVENUE COUPONS ITEMS
328 21 Fruits 2019-02-24 14:00:00 0 0 0
Во время поиска я наткнулся на решения с использованием reindex
или grouper
, но я не уверен, что они подойдут для моей проблемы. Какие-либо предложения?
Спасибо за внимание.
Создайте комбинированный столбец для даты и времени:
df['DATETIME'] = pd.to_datetime(df['DATE'] + ' ' + df['HOUR'])
Отбросьте лишнюю информацию:
df.drop(['DATE','HOUR'], inplace=True, axis = 1)
Теперь сгруппируйте по MARKET_ID
и SECTOR
и используйте resample
с опцией H
ours и заполните недостающие значения 0:
df.groupby(['MARKET_ID', 'SECTOR']).\
apply(lambda x : x.set_index('DATETIME').resample('H').mean().fillna(0))
Вы можете использовать resample
здесь:
# df['DATE'] = pd.to_datetime(df['DATE'])
# df['HOUR'] = pd.to_timedelta(df['HOUR'])
grp = df.set_index(df['DATE']+df['HOUR']).groupby(['MARKET_ID', 'SECTOR'],
sort=False).resample('H').sum().reset_index(level=1)
SECTOR MARKET_ID REVENUE COUPONS ITEMS
MARKET_ID
21 2019-02-24 15:00:00 Fruits 21 808.60 19 29
2019-02-24 16:00:00 Fruits 0 0.00 0 0
2019-02-24 17:00:00 Fruits 0 0.00 0 0
2019-02-24 18:00:00 Fruits 0 0.00 0 0
2019-02-24 19:00:00 Fruits 0 0.00 0 0
2019-02-24 20:00:00 Fruits 0 0.00 0 0
2019-02-24 21:00:00 Fruits 0 0.00 0 0
2019-02-24 22:00:00 Fruits 21 267.54 8 8
2019-02-24 23:00:00 Fruits 0 0.00 0 0
2019-02-25 00:00:00 Fruits 0 0.00 0 0
2019-02-25 01:00:00 Fruits 0 0.00 0 0
2019-02-25 02:00:00 Fruits 0 0.00 0 0
2019-02-25 03:00:00 Fruits 0 0.00 0 0
2019-02-25 04:00:00 Fruits 0 0.00 0 0
2019-02-25 05:00:00 Fruits 0 0.00 0 0
2019-02-25 06:00:00 Fruits 0 0.00 0 0
2019-02-25 07:00:00 Fruits 0 0.00 0 0
2019-02-25 08:00:00 Fruits 0 0.00 0 0
2019-02-25 09:00:00 Fruits 0 0.00 0 0
2019-02-25 10:00:00 Fruits 0 0.00 0 0
2019-02-25 11:00:00 Fruits 0 0.00 0 0
2019-02-25 12:00:00 Fruits 0 0.00 0 0
2019-02-25 13:00:00 Fruits 0 0.00 0 0
2019-02-25 14:00:00 Fruits 0 0.00 0 0
2019-02-25 15:00:00 Fruits 0 0.00 0 0
2019-02-25 16:00:00 Fruits 0 0.00 0 0
2019-02-25 17:00:00 Fruits 0 0.00 0 0
2019-02-25 18:00:00 Fruits 0 0.00 0 0
2019-02-25 19:00:00 Fruits 0 0.00 0 0
2019-02-25 20:00:00 Fruits 0 0.00 0 0
2019-02-25 21:00:00 Fruits 0 0.00 0 0
2019-02-25 22:00:00 Fruits 0 0.00 0 0
2019-02-25 23:00:00 Fruits 0 0.00 0 0
2019-02-26 00:00:00 Fruits 0 0.00 0 0
2019-02-26 01:00:00 Fruits 0 0.00 0 0
2019-02-26 02:00:00 Fruits 0 0.00 0 0
2019-02-26 03:00:00 Fruits 0 0.00 0 0
2019-02-26 04:00:00 Fruits 0 0.00 0 0
2019-02-26 05:00:00 Fruits 0 0.00 0 0
2019-02-26 06:00:00 Fruits 0 0.00 0 0
2019-02-26 07:00:00 Fruits 0 0.00 0 0
2019-02-26 08:00:00 Fruits 0 0.00 0 0
2019-02-26 09:00:00 Fruits 0 0.00 0 0
2019-02-26 10:00:00 Fruits 0 0.00 0 0
2019-02-26 11:00:00 Fruits 0 0.00 0 0
2019-02-26 12:00:00 Fruits 0 0.00 0 0
2019-02-26 13:00:00 Fruits 0 0.00 0 0
2019-02-26 14:00:00 Fruits 0 0.00 0 0
2019-02-26 15:00:00 Fruits 0 0.00 0 0
2019-02-26 16:00:00 Fruits 0 0.00 0 0
... ... ... ... ... ...
2019-03-01 14:00:00 Dairy 0 0.00 0 0
2019-03-01 15:00:00 Dairy 0 0.00 0 0
2019-03-01 16:00:00 Dairy 0 0.00 0 0
2019-03-01 17:00:00 Dairy 0 0.00 0 0
2019-03-01 18:00:00 Dairy 0 0.00 0 0
2019-03-01 19:00:00 Dairy 0 0.00 0 0
2019-03-01 20:00:00 Dairy 0 0.00 0 0
2019-03-01 21:00:00 Dairy 0 0.00 0 0
2019-03-01 22:00:00 Dairy 0 0.00 0 0
2019-03-01 23:00:00 Dairy 0 0.00 0 0
2019-03-02 00:00:00 Dairy 0 0.00 0 0
2019-03-02 01:00:00 Dairy 0 0.00 0 0
2019-03-02 02:00:00 Dairy 0 0.00 0 0
2019-03-02 03:00:00 Dairy 0 0.00 0 0
2019-03-02 04:00:00 Dairy 0 0.00 0 0
2019-03-02 05:00:00 Dairy 0 0.00 0 0
2019-03-02 06:00:00 Dairy 0 0.00 0 0
2019-03-02 07:00:00 Dairy 0 0.00 0 0
2019-03-02 08:00:00 Dairy 0 0.00 0 0
2019-03-02 09:00:00 Dairy 0 0.00 0 0
2019-03-02 10:00:00 Dairy 0 0.00 0 0
2019-03-02 11:00:00 Dairy 0 0.00 0 0
2019-03-02 12:00:00 Dairy 0 0.00 0 0
2019-03-02 13:00:00 Dairy 0 0.00 0 0
2019-03-02 14:00:00 Dairy 0 0.00 0 0
2019-03-02 15:00:00 Dairy 0 0.00 0 0
2019-03-02 16:00:00 Dairy 0 0.00 0 0
2019-03-02 17:00:00 Dairy 0 0.00 0 0
2019-03-02 18:00:00 Dairy 0 0.00 0 0
2019-03-02 19:00:00 Dairy 0 0.00 0 0
2019-03-02 20:00:00 Dairy 0 0.00 0 0
2019-03-02 21:00:00 Dairy 0 0.00 0 0
2019-03-02 22:00:00 Dairy 0 0.00 0 0
2019-03-02 23:00:00 Dairy 0 0.00 0 0
2019-03-03 00:00:00 Dairy 0 0.00 0 0
2019-03-03 01:00:00 Dairy 0 0.00 0 0
2019-03-03 02:00:00 Dairy 0 0.00 0 0
2019-03-03 03:00:00 Dairy 0 0.00 0 0
2019-03-03 04:00:00 Dairy 0 0.00 0 0
2019-03-03 05:00:00 Dairy 0 0.00 0 0
2019-03-03 06:00:00 Dairy 0 0.00 0 0
2019-03-03 07:00:00 Dairy 0 0.00 0 0
2019-03-03 08:00:00 Dairy 0 0.00 0 0
2019-03-03 09:00:00 Dairy 0 0.00 0 0
2019-03-03 10:00:00 Dairy 0 0.00 0 0
2019-03-03 11:00:00 Dairy 0 0.00 0 0
2019-03-03 12:00:00 Dairy 0 0.00 0 0
2019-03-03 13:00:00 Dairy 0 0.00 0 0
2019-03-03 14:00:00 Dairy 0 0.00 0 0
2019-03-03 15:00:00 Dairy 21 122.69 4 4
[180 rows x 5 columns]
Спасибо, это сработало. Один вопрос: как я могу экстраполировать пределы, чтобы иметь все 24 часа в крайних случаях? например Рынок с идентификатором 21 на дату 2018-08-08 (первый день набора) имеет первую запись в 15:00:00; как я могу иметь строки с нулями от datetime 2018-08-08 00:00:00 до datetime 2018-08-08 14:00:00?