single multiindex index groupby pandas

multiindex - pandas reindex



Obtenga valores únicos de la columna de índice en MultiIndex (2)

Sé que puedo obtener los valores únicos de un DataFrame al restablecer el índice, pero ¿hay alguna manera de evitar este paso y obtener los valores únicos directamente?

Dado que tengo:

C A B 0 one 3 1 one 2 2 two 1

Puedo hacer:

df = df.reset_index() uniq_b = df.B.unique() df = df.set_index([''A'',''B''])

¿Hay alguna forma de crear pandas para hacer esto?


La respuesta de Andy Hayden ( index.levels[blah] ) es excelente para algunos escenarios, pero puede provocar un comportamiento extraño en otros. Tengo entendido que Pandas hace todo lo posible para "reutilizar" los índices cuando es posible para evitar que los índices de muchos DataFrames indexados de manera similar ocupen espacio en la memoria. Como resultado, he encontrado el siguiente comportamiento molesto :

import pandas as pd import numpy as np np.random.seed(0) idx = pd.MultiIndex.from_product([[''John'', ''Josh'', ''Alex''], list(''abcde'')], names=[''Person'', ''Letter'']) large = pd.DataFrame(data=np.random.randn(15, 2), index=idx, columns=[''one'', ''two'']) small = large.loc[[''Jo''==d[0:2] for d in large.index.get_level_values(''Person'')]] print small.index.levels[0] print large.index.levels[0]

Que salidas

Index([u''Alex'', u''John'', u''Josh''], dtype=''object'') Index([u''Alex'', u''John'', u''Josh''], dtype=''object'')

en lugar de lo esperado

Index([u''John'', u''Josh''], dtype=''object'') Index([u''Alex'', u''John'', u''Josh''], dtype=''object'')

Como señaló una persona en el otro hilo, una expresión que parece muy natural y funciona correctamente sería:

small.index.get_level_values(''Person'').unique() large.index.get_level_values(''Person'').unique()

Espero que esto ayude a alguien más a esquivar el comportamiento súper inesperado con el que me encontré.


Una forma es usar index.levels :

In [11]: df Out[11]: C A B 0 one 3 1 one 2 2 two 1 In [12]: df.index.levels[1] Out[12]: Index([one, two], dtype=object)