¿Cómo accedo al marco de datos groupby correspondiente en un objeto groupby mediante la clave?
Con el siguiente groupby:
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 los 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 acceder a un grupo por su clave:
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 trato de hacer eso gb[('foo',)]
obtengo este pandas.core.groupby.DataFrameGroupBy
objeto extraño que no parece tener ningún método que corresponda al DataFrame que quiero.
Lo mejor que se me ocurre 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 un poco desagradable, considerando lo buenos que suelen ser los pandas en estas cosas.
¿Cuál es la forma integrada de hacer esto?
groups = dict(list(gb))
solo almacene la columnaC
? Digamos que no estoy interesado en las otras columnas y, por lo tanto, no quiero almacenarlas.dict(list( df.groupby(['A'])['C'] ))
dict(iter(g))
. (¡aunqueget_group
es la mejor manera / ya que no implica crear un diccionario / te mantiene en pandas!: D)gb_dict = {str(indx): str(val) for indx in gb.indx for val in gb.some_key}
y luego recuperar el valor a través degb_dict[some_key]
get_group()
, esta receta no ha sido necesaria por años.Más bien que
Prefiero usar
gb.groups
Porque de esta manera también puedes elegir varias columnas. por ejemplo:
fuente
gb[["A", "B"]].get_group("foo")
.Si está buscando un grupo selectivo por objetos, entonces: gb_groups.keys (), e ingrese la clave deseada en la siguiente lista de claves.
fuente
Estaba buscando una forma de probar algunos miembros del grupo. Obj. Tenía que abordar la pregunta publicada para hacer esto.
crear objeto groupby
elija N marcos de datos y tome sus indicaciones
agarra los grupos
opcionalmente: vuelva a convertir todo en un solo objeto de marco de datos
fuente
sampled_df_i = random.sample(grouped.indicies, N)
AttributeError: 'DataFrameGroupBy' object has no attribute 'indicies'