new multiple groupby example create columns python group-by dataframe pandas

python - multiple - Cómo acceder a pandas groupby dataframe por clave



pandas groupby create new dataframe (5)

¿Cómo accedo al groupby dataframe correspondiente en un groupby objeto por la clave? Con el siguiente grupoby:

rand = np.random.RandomState(1) df = pd.DataFrame({''A'': [''foo'', ''bar''] * 3, ''B'': rand.randn(6), ''C'': rand.randint(0, 20, 6)}) gb = df.groupby([''A''])

Puedo recorrerlo para obtener las claves y grupos:

In [11]: for k, gp in gb: print ''key='' + str(k) print gp key=bar A B C 1 bar -0.611756 18 3 bar -1.072969 10 5 bar -2.301539 18 key=foo A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14

Me gustaría poder hacer algo como

In [12]: gb[''foo''] Out[12]: A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14

Pero cuando hago eso (bueno, en realidad tengo que hacer gb[(''foo'',)] ), obtengo este extraño elemento pandas.core.groupby.DataFrameGroupBy que no parece tener ningún método que se corresponda con el DataFrame Yo quiero.

Lo mejor que puedo pensar es

In [13]: def gb_df_key(gb, key, orig_df): ix = gb.indices[key] return orig_df.ix[ix] gb_df_key(gb, ''foo'', df) Out[13]: A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14

pero esto es algo desagradable, teniendo en cuenta lo buenos que suelen ser los pandas en estas cosas.
¿Cuál es la forma integrada de hacer esto?


Estaba buscando una forma de probar algunos miembros del obj GroupBy - tuve que abordar la pregunta publicada para hacer esto.

crear grupo por objeto

grouped = df.groupdy(''some_key'')

elige N dataframes y toma sus indicios

sampled_df_i = random.sample(grouped.indicies,N)

agarrar los grupos

df_list = map(lambda df_i: grouped.get_group(df_i),sampled_df_i)

opcionalmente, vuélvalo a convertir en un único objeto de marco de datos

sampled_df = pd.concat(df_list, axis=0, join=''outer'')


Más bien que

gb.get_group(''foo'')

Prefiero usar gb.groups

df.loc[gb.groups[''foo'']]

Porque de esta manera puedes elegir varias columnas también. por ejemplo:

df.loc[gb.groups[''foo''],(''A'',''B'')]


Puedes usar el método get_group :

In [21]: gb.get_group(''foo'') Out[21]: A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14

Nota: Esto no requiere la creación de un diccionario intermediario / copia de cada subdataframe para cada grupo, por lo que será mucho más eficiente con la memoria que crear el diccionario ingenuo con dict(iter(gb)) . Esto se debe a que usa estructuras de datos ya disponibles en el grupo por objeto.

Puede seleccionar diferentes columnas usando el grupo por slicing:

In [22]: gb[["A", "B"]].get_group("foo") Out[22]: A B 0 foo 1.624345 2 foo -0.528172 4 foo 0.865408 In [23]: gb["C"].get_group("foo") Out[23]: 0 5 2 11 4 14 Name: C, dtype: int64


Wes McKinney (autor de pandas) en Python para análisis de datos proporciona la siguiente receta:

groups = dict(list(gb))

que devuelve un diccionario cuyas claves son las etiquetas de grupo y cuyos valores son DataFrames, es decir,

groups[''foo'']

rendirá lo que estás buscando:

A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14


gb = df.groupby([''A'']) gb_groups = grouped_df.groups

Si está buscando grupos selectos por objetos, haga: gb_groups.keys (), e ingrese la clave deseada en la siguiente key_list.

gb_groups.keys() key_list = [key1, key2, key3 and so on...] for key, values in gb_groups.iteritems(): if key in key_list: print df.ix[values], "/n"