#python #dataframe #date #reindex
Вопрос:
Эй, я видел ответы на многие вопросы, в которых максимальная и минимальная дата являются постоянными в выходных данных. Но как насчет заполнения дат для каждого идентификатора, где вы только то, что нужно заполнить между каждой максимальной и минимальной датой идентификаторов. Скажем, например, это фрейм данных
x = панды.Фрейм данных({‘пользователь’: [‘a’,’a’,’b’,’b’,’a’], ‘dt’: [‘2016-01-01′,’2016-01-02’, ‘2016-01-05′,’2016-01-09′,’2016-01-06’], ‘val’: [1,33,2,1,2]})
Желаемый результат —
Дата | пользователь | вэл |
---|---|---|
2016-01-01 | a | 1.0 |
2016-01-02 | a | 33.0 |
2016-01-03 | a | 0.0 |
2016-01-04 | a | 0.0 |
2016-01-05 | a | 0.0 |
2016-01-06 | a | 2.0 |
2016-01-05 | b | 2.0 |
2016-01-06 | b | 0.0 |
2016-01-07 | b | 0.0 |
2016-01-08 | b | 0.0 |
2016-01-09 | b | 1.0 |
В настоящее время используется этот код
udates=x['dt'].unique()
x['dt'] = pandas.to_datetime(x['dt'])
filled_df = (x.set_index('dt')
.groupby('user')
.apply(lambda d: d.reindex(pd.date_range(min(x.dt),
max(x.dt),
freq='D')))
.drop('user', axis=1)
.reset_index('user')
.fillna(0))
Текущая выходная мощность заполняет даты для B до его минимальной даты
Дата | пользователь | вэл |
---|---|---|
2016-01-01 | a | 1.0 |
2016-01-02 | a | 33.0 |
2016-01-03 | a | 0.0 |
2016-01-04 | a | 0.0 |
2016-01-05 | a | 0.0 |
2016-01-06 | a | 2.0 |
2016-01-01 | b | 0.0 |
2016-01-02 | b | 0.0 |
2016-01-03 | b | 0.0 |
2016-01-04 | b | 0.0 |
2016-01-05 | b | 2.0 |
2016-01-06 | b | 0.0 |
2016-01-07 | b | 0.0 |
2016-01-08 | b | 0.0 |
2016-01-09 | b | 1.0 |
Помощь очень ценится!!!
Ответ №1:
Основываясь на вашем решении, я просто заменил min(x.dt)
его min(d.index)
:
import pandas as pd
x = pd.DataFrame({'user': ['a','a','b','b','a'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})
x['dt'] = pd.to_datetime(x['dt'])
filled_df = (x.set_index('dt')
.groupby('user')
.apply(lambda d: d.reindex(pd.date_range(min(d.index),
max(x.dt),
freq='D')))
.drop('user', axis=1)
.reset_index('user')
.fillna(0))
выход
>>> filled_df
user val
2016-01-01 a 1.0
2016-01-02 a 33.0
2016-01-03 a 0.0
2016-01-04 a 0.0
2016-01-05 a 0.0
2016-01-06 a 2.0
2016-01-07 a 0.0
2016-01-08 a 0.0
2016-01-09 a 0.0
2016-01-05 b 2.0
2016-01-06 b 0.0
2016-01-07 b 0.0
2016-01-08 b 0.0
2016-01-09 b 1.0
Комментарии:
1. min(x.dt) и max(x.dt) с помощью min(d.index) и max(d.index) он также работает для более широкого диапазона дат. Спасибо!