Quiero usar groupby().transform() para hacer una personalizada (acumulativa) de transformación de cada bloque de registros en un (clasificado) conjunto de datos. A menos que me aseguro de tener una clave única, no funciona. Por qué?

Aquí un juguete ejemplo:

df = pd.DataFrame([[1,1],
                  [1,2],
                  [2,3],
                  [3,4],
                  [3,5]], 
                  columns='a b'.split())
df['partials'] = df.groupby('a')['b'].transform(np.cumsum)
df

da a la espera:

     a   b   partials
0    1   1   1
1    1   2   3
2    2   3   3
3    3   4   4
4    3   5   9

pero si ‘a’ es una clave, todo va mal:

df = df.set_index('a')
df['partials'] = df.groupby(level=0)['b'].transform(np.cumsum)
df

---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-146-d0c35a4ba053> in <module>()
      3 
      4 df = df.set_index('a')
----> 5 df.groupby(level=0)['b'].transform(np.cumsum)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/groupby.pyc in transform(self, func, *args, **kwargs)
   1542             res = wrapper(group)
   1543             # result[group.index] = res
-> 1544             indexer = self.obj.index.get_indexer(group.index)
   1545             np.put(result, indexer, res)
   1546 

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/index.pyc in get_indexer(self, target, method, limit)
    847 
    848         if not self.is_unique:
--> 849             raise Exception('Reindexing only valid with uniquely valued Index '
    850                             'objects')
    851 

Exception: Reindexing only valid with uniquely valued Index objects

Mismo error si selecciona la columna ‘b’ antes de agrupación, es decir,.

df['b'].groupby(level=0).transform(np.cumsum)

pero usted puede hacer el trabajo si usted transformar todo el dataframe, como:

df.groupby(level=0).transform(np.cumsum)

o incluso una columna dataframe (en lugar de en serie):

df.groupby(level=0)[['b']].transform(np.cumsum)

Siento que hay algunos todavía alguna parte profunda de GroupBy-fu de que me estoy perdiendo. Puede alguien me corrigieron?

  • Sí, es lo que quiero – las sumas parciales de la » b » dentro de los grupos de ‘un’. Me aclaró la ilustración de arriba. En mi ejemplo, ‘a’ es una marca de hora y b son algunas de las claves de los demás, así que mi conjunto de datos es en realidad una colección de una serie de tiempo de diferentes longitudes (que se superponen en el tiempo y contienen duplicados dentro de las marcas de tiempo y a través de grupos). Yo estoy usando la de transformar() para hacer acumulativa de las operaciones en cada serie de tiempo del segmento, como los promedios móviles y así sucesivamente.
InformationsquelleAutor patricksurry | 2013-05-01

1 Comentario

  1. 5

    Esto fue un error, ya que fija en pandas (seguramente en 0.15.2, si mal no recuerdo, fue fijado en un 0,14), así que ya no debería ver esta excepción.


    Como una solución, en anteriores pandas puede utilizar aplicar:

    In [10]: g = df.groupby(level=0)['b']
    
    In [11]: g.apply(np.cumsum)
    Out[11]:
    a
    1    1
    1    3
    2    3
    3    4
    3    9
    dtype: int64

    y puede asignar esta a una columna en el df

    In [12]: df['partial'] = g.apply(np.cumsum)
    • Genial, gracias – me imagino que no entienden la diferencia entre aplicar() y transformar() a continuación. Es transformar de alguna manera más restrictiva??
    • Me pregunto si es un error, sin duda se ve como debería caber en la transformación de la categoría…
    • transformar espera un resultado a todas las cosas en el grupo, mientras que se aplican espera un valor para cada fila en el grupo. Aunque tanto la ley de los grupos (sub DataFrames) por lo que es un poco confuso.
    • Eso tiene sentido, pero no parece estar muy claramente documentado. Por ejemplo, aquí comienza describiendo transformar como una forma de aplicar, y luego hace un sonido casi equivalente: «… Para estos, el uso de la aplicación función, que puede ser sustituido por tanto agregado y transformación, en muchos de los casos de uso estándar. Sin embargo, puede manejar algunos de los excepcionales casos de uso, por ejemplo…»

Dejar respuesta

Please enter your comment!
Please enter your name here