¿Cómo hacer referencia a un grupo por índice cuando se usa apply, transform, agg – Python Pandas?

Para ser concretos, digamos que tenemos dos DataFrames:

df1:

date A 0 12/1/14 3 1 12/1/14 1 2 12/3/14 2 3 12/3/14 3 4 12/3/14 4 5 12/6/14 5 

df2:

  B 12/1/14 10 12/2/14 20 12/3/14 10 12/4/14 30 12/5/14 10 12/6/14 20 

Ahora quiero agrupar por fecha en df1, y tomar una sum del valor A en cada grupo y luego normalizarlo por el valor de B en df2 en la fecha correspondiente. Algo como esto

 df1.groupby('date').agg(lambda x: np.sum(x)/df2.loc[x.date,'B']) 

La pregunta es que ni el agregado, la aplicación ni la transformación pueden hacer referencia al índice. ¿Alguna idea de cómo solucionar esto?

Cuando llama a .groupby('column') hace que la column forme parte del índice DataFrameGroupBy . Y es accesible a través de la propiedad .index .

Entonces, en su caso, asumiendo que la date NO es parte del índice en cualquiera de los dos df esto debería funcionar:

 def f(x): return x.sum() / df2.set_index('date').loc[x.index[0], 'B'] df1.set_index('date').groupby(level='date').apply(f) 

Esto produce:

  A date 2014-01-12 0.40 2014-03-12 0.90 2014-06-12 0.25 

Si la date está en el índice de df2, simplemente use df2.loc[x.index[0], 'B'] en el código anterior.

Si la date está en df1.index cambie la última línea a df1.groupby(level='date').apply(f) .

 > df_grouped = df1.groupby('date').sum() > print df_grouped['A] /df2['B'].astype(float) date 12/1/14 0.40 12/2/14 NaN 12/3/14 0.90 12/4/14 NaN 12/5/14 NaN 12/6/14 0.25 dtype: float64