risposta di Andy Hayden (index.levels[blah]
) è grande per alcuni scenari, ma può portare a comportamento strano in altri. La mia comprensione è che Pandas fa di tutto per riutilizzare gli indici quando è possibile per evitare di avere gli indici di molti DataFrame indicizzati allo stesso modo che occupano spazio nella memoria. Come risultato, I've found the following annoying behavior:
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]
che emette
Index([u'Alex', u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')
anziché il previsto
Index([u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')
Come una persona ha sottolineato dall'altro filo, un linguaggio che sembra molto naturale e funziona correttamente sarebbe:
small.index.get_level_values('Person').unique()
large.index.get_level_values('Person').unique()
Spero che questo aiuti qualcun altro a schivare il comportamento inaspettato in cui mi sono imbattuto.
non capisco il tuo esempio. uniq_b non viene utilizzato? –
ah, penso di averlo capito. volevi solo "conoscere" i valori unici di B. ok. –
Se è possibile seth, penso che dovresti considerare di cambiare la risposta accettata su 8one6. – KobeJohn