Эффективный способ заполнить пропущенные даты по группам в пандах? - PullRequest
0 голосов
/ 08 октября 2019

Итак, у меня есть такой фрейм данных:

   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, генерируемые этим методом. Это намного быстрее, чем первый вариант, но, похоже, не самый лучший. Есть ли лучший способ сделать это, это лучше для больших фреймов данных?

...