Estoy buscando una manera de obtener una lista de todas las claves en un objeto GroupBy, pero parece que no puedo encontrar una a través de los documentos ni a través de Google.
Definitivamente hay una forma de acceder a los grupos a través de sus claves, así:
df_gb = df.groupby(['EmployeeNumber']) df_gb.get_group(key)... así que imagino que hay una forma de acceder a una lista (o similar) de las claves en un objeto GroupBy. Estoy buscando algo como esto:
df_gb.keys Out: [1234, 2356, 6894, 9492]Me imagino que podría recorrer el objeto GroupBy y obtener las claves de esa manera, pero creo que tiene que haber una mejor manera.
Puede acceder a esto a través del atributo .groups en el objeto groupby , esto devuelve un dict, las claves del dict le dan los grupos:
In [40]: df = pd.DataFrame({'group':[0,1,1,1,2,2,3,3,3], 'val':np.arange(9)}) gp = df.groupby('group') gp.groups.keys() Out[40]: dict_keys([0, 1, 2, 3]) Aquí está la salida de los groups :
In [41]: gp.groups Out[41]: {0: Int64Index([0], dtype='int64'), 1: Int64Index([1, 2, 3], dtype='int64'), 2: Int64Index([4, 5], dtype='int64'), 3: Int64Index([6, 7, 8], dtype='int64')}Actualizar
parece que debido a que el tipo de groups es un dict , entonces el orden del grupo no se mantiene cuando llamas a las keys :
In [65]: df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)}) gp = df.groupby('group') gp.groups.keys() Out[65]: dict_keys(['b', 'e', 'g', 'a', 'x']) si llamas a groups puedes ver que se mantiene el orden:
In [79]: gp.groups Out[79]: {'a': Int64Index([2, 3, 4], dtype='int64'), 'b': Int64Index([0, 5, 8], dtype='int64'), 'e': Int64Index([7], dtype='int64'), 'g': Int64Index([1], dtype='int64'), 'x': Int64Index([6], dtype='int64')} luego se mantiene el orden de las claves, un truco alrededor de esto es acceder al atributo .name de cada grupo:
In [78]: gp.apply(lambda x: x.name) Out[78]: group aa bb ee gg xx dtype: objectlo cual no es bueno ya que esto no está vectorizado, sin embargo, si ya tiene un objeto agregado, puede obtener los valores del índice:
In [81]: agg = gp.sum() agg Out[81]: val group a 9 b 13 e 7 g 1 x 6 In [83]: agg.index.get_level_values(0) Out[83]: Index(['a', 'b', 'e', 'g', 'x'], dtype='object', name='group')Un problema con la respuesta de EdChum es que obtener claves al iniciar gp.groups.keys() primero construye el diccionario de grupo completo. En marcos de datos grandes, esta es una operación muy lenta, que efectivamente duplica el consumo de memoria. Iterar es mucho más rápido:
df = pd.DataFrame({'group':list('bgaaabxeb'), 'val':np.arange(9)}) gp = df.groupby('group') keys = [key for key, _ in gp] Ejecutar esta comprensión de lista me tomó 16 s en mi objeto groupby, mientras que tuve que interrumpir gp.groups.keys() después de 3 minutos.
Utilice la opción sort=False para reservar el orden de las claves de grupo gp = df.groupby('group', sort=False)