los pandas llenan el problema de rendimiento

Tengo un dataframe con un índice múltiple (Fecha, Tiempo de entrada) y este dataframe puede contener algunos valores de NA en las columnas (Valor, Id). Quiero completar el valor de avance pero solo por fecha y no encuentro de ninguna manera hacer esto de una manera muy eficiente.

Aquí está el tipo de dataframe que tengo:

Ejemplo de marco de datos

Y aquí está el resultado que quiero:

Marco de datos debidamente rellenado por fecha solamente

Entonces, para rellenar adecuadamente por fecha, puedo usar la función groupby (nivel = 0). Groupby es rápido, pero la función de relleno que se aplica en el dataframe group by date es realmente demasiado lenta.

Aquí está el código que utilizo para comparar el relleno simple hacia adelante (que no da el resultado esperado pero se ejecuta muy rápidamente) y el relleno esperado por fecha (que da el resultado esperado pero en realidad es demasiado lento).

import numpy as np import pandas as pd import datetime as dt # Show pandas & numpy versions print('pandas '+pd.__version__) print('numpy '+np.__version__) # Build a big list of (Date,InputTime,Value,Id) listdata = [] d = dt.datetime(2001,10,6,5) for i in range(0,100000): listdata.append((d.date(), d, 2*i if i%3==1 else np.NaN, i if i%3==1 else np.NaN)) d = d + dt.timedelta(hours=8) # Create the dataframe with Date and InputTime as index df = pd.DataFrame.from_records(listdata, index=['Date','InputTime'], columns=['Date', 'InputTime', 'Value', 'Id']) # Simple Fill forward on index start = dt.datetime.now() for col in df.columns: df[col] = df[col].ffill() end = dt.datetime.now() print "Time to fill forward on index = " + str((end-start).total_seconds()) + " s" # Fill forward on Date (first level of index) start = dt.datetime.now() for col in df.columns: df[col] = df[col].groupby(level=0).ffill() end = dt.datetime.now() print "Time to fill forward on Date only = " + str((end-start).total_seconds()) + " s" 

Resultados

¿Alguien podría explicarme por qué este código es tan lento o ayudarme a encontrar una manera eficiente de completar la fecha en grandes marcos de datos?

Gracias

github / jreback: este es un duplicado de # 7895. .ffill no se implementa en cython en una operación groupby (aunque ciertamente podría estarlo), y en su lugar llama espacio python en cada grupo. Aquí hay una manera fácil de hacer esto. url: https://github.com/pandas-dev/pandas/issues/11296

de acuerdo con la respuesta de jreback, cuando haces un groupby ffill () no está optimizado, pero cumsum () está. prueba esto:

 df = df.sort_index() df.ffill() * (1 - df.isnull().astype(int)).groupby(level=0).cumsum().applymap(lambda x: None if x == 0 else 1)