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)