pandas get_level_values Pour plusieurs colonnes

Y a-t-il un moyen d'obtenir le résultat
http://pandas.pydata.org/panda ... .html
Pour plus d'une colonne?

Compte tenu de ce qui suit
DataFrame

:


d
a b c
1 4 10 16
11 17
5 12 18
2 5 13 19
6 14 20
3 7 15 21


Je veux avoir des valeurs / t.

e.

Liste des tuples/ Niveaux
a

et
c

:


[/1, 10/, /1, 11/, /1, 12/, /2, 13/, /2, 14/, /3, 15/]


Entrées

:

Impossible à donner
get_level_values

plus d'un niveau /

par exemple

,
df.index.get_level_values/['a','c']

/

Il y a une solution de contournement dans laquelle vous pouvez utiliser
get_level_values

au-dessus de chaque colonne souhaitée et
zip

eux autres ensemble:

Par exemple:


a_list = df.index.get_level_values/'a'/.values
c_list = df.index.get_level_values/'c'/.values

print/[i for i in zip/a_list,c_list/]/
[/1, 10/, /1, 11/, /1, 12/, /2, 13/, /2, 14/, /3, 15/]


Mais cela devient volumineux, car le nombre de colonnes grandit.

Code pour la construction d'un exemple
DataFrame

:


df = pd.DataFrame/{'a':[1,1,1,2,2,3],'b':[4,4,5,5,6,7,],'c':[10,11,12,13,14,15], 'd':[16,17,18,19,20,21]}/.set_index/['a','b','c']/
Invité:

Hannah

Confirmation de:

Méthode
.tolist//

a
MultiIndex

donne une liste de tuples pour tous les niveaux de
MultiIndex

. Par exemple, avec votre exemple
DataFrame

,


df.index.tolist//
# => [/1, 4, 10/, /1, 4, 11/, /1, 5, 12/, /2, 5, 13/, /2, 6, 14/, /3, 7, 15/]


Alors, voici deux idées:

Obtenez une liste de tuples de l'original
MultiIndex

Et filtrer le résultat.


[/a, c/ for a, b, c in df.index.tolist//]
# => [/1, 10/, /1, 11/, /1, 12/, /2, 13/, /2, 14/, /3, 15/]


L'inconvénient de cette méthode simple est que vous devez spécifier manuellement le niveau de niveaux souhaité. Au lieu de cela, vous pouvez utiliser
itertools.compress

, Pour les sélectionner par nom.


from itertools import compress

mask = [1 if name in ['a', 'c'] else 0 for name in df.index.names]
[tuple/compress/t, mask// for t in df.index.tolist//]
# => [/1, 10/, /1, 11/, /1, 12/, /2, 13/, /2, 14/, /3, 15/]


Créer MultiIndex, qui a ces niveaux que vous voulez et appelez
.tolist//

Sur lui.


df.index.droplevel/'b'/.tolist//
# => [/1, 10/, /1, 11/, /1, 12/, /2, 13/, /2, 14/, /3, 15/]


Si vous préférez appeler les niveaux que vous souhaitez enregistrer —, et pas ceux que vous voulez perdre —, Vous pouvez faire quelque chose comme


df.index.droplevel/[level for level in df.index.names
if not level in ['a', 'c']]/.tolist//
# => [/1, 10/, /1, 11/, /1, 12/, /2, 13/, /2, 14/, /3, 15/]

Alice

Confirmation de:

Il est moins lourd car vous pouvez transférer la liste des noms d'index que vous souhaitez choisir:


df.reset_index//[['a', 'c']].to_dict/orient='split'/['data']


Je n'ai pas trouvé de moyen de choisir des niveaux
'a'

et
'b'

directement de l'objet d'index, utilisez donc
reset_index

.

noter que
to_dict

Renvoie une liste des listes, pas des tuples:


[[1, 10], [1, 11], [1, 12], [2, 13], [2, 14], [3, 15]]

Pour répondre aux questions, connectez-vous ou registre