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"