Итак, у меня есть такой фрейм данных:
date ID value
2018-01-01 A 10
2018-02-01 A 11
2018-04-01 A 13
2017-08-01 B 20
2017-10-01 B 21
2017-11-01 B 23
В каждой группе могут быть очень разные даты, и около 400 тыс. Групп. Итак, что я хочу сделать, это заполнить пропущенные даты каждой группы эффективным способом, чтобы это выглядело так:
date ID value
2018-01-01 A 10
2018-02-01 A 11
2018-03-01 A nan
2018-04-01 A 13
2017-08-01 B 20
2017-09-01 B nan
2017-10-01 B 21
2017-11-01 B 23
Я пробовал два подхода:
df2 = df.groupby('ID').apply(lambda x: x.set_index('date').resample('D').pad())
А также:
df2= df.set_index(['date','ID']).unstack().stack(dropna=False).reset_index()
df2= df2.sort_values(by=['ID','date']).reset_index(drop=True)
df2= df2[df2.groupby('ID').value.ffill().notna()]
df2 = df2[df2.groupby('ID').value.bfill().notna()]
Первый, поскольку он использует apply
, очень медленный. Я думаю, я мог бы использовать что-то другое вместо pad
, поэтому я получаю nan
вместо предыдущего значения, но я не уверен, что это повлияет на производительность достаточно. Я ждал около 15 минут, и он не закончил работу.
Вторая заполняет от первой даты во всем информационном кадре до последнего для каждой группы, что приводит к массивному информационному кадру. После этого я отбрасываю все начальные и конечные значения nan
, генерируемые этим методом. Это намного быстрее, чем первый вариант, но, похоже, не самый лучший. Есть ли лучший способ сделать это, это лучше для больших фреймов данных?