MultiIndex de pandas est pratique, mais j'étais accro à simplement le traiter comme une version multidimensionnelle d'Index, alors prenez-en note.
À titre d'exemple, supposons que le tableau suivant existe sous le nom «hoge.csv».
val | ||
---|---|---|
1 | a | b |
2 | c | d |
3 | a | d |
4 | b | c |
5 | a | b |
Si vous lisez les colonnes autres que val dans hoge.csv
comme index, elles seront lues comme DataFrame de MultiIndex.
>>> import pandas as pd
>>> df = pd.read_csv("hoge.csv", index_col=[0, 1])
>>> df
val
1 a b
2 c d
3 a d
4 b c
5 a b
Essayez de filtrer ce DataFrame approprié avec val
>>> tmp_df = df.query("val=='b'")
>>> tmp_df.index
MultiIndex([(1, 'a'),
(5, 'a')],
)
Deux éléments ont été extraits du DataFrame des cinq éléments.
De plus, si vous obtenez la 0ème couche de la propriété levels
pour le résultat filtré, vous pourriez obtenir1,5
...
>>> tmp_df.index.levels[0]
Int64Index([1, 2, 3, 4, 5], dtype='int64')
Quel que soit le filtre ** Les éléments de la 0ème couche du DataFrame d'origine sont récupérés ** Cela pose un problème car vous souhaitez parfois extraire les valeurs de chaque couche dans l'état après filtrage en définissant des conditions pour les valeurs du tableau.
Niveaux est juste une liste qui stocke les éléments inclus dans chaque niveau, et il semble que cela soit réalisé en combinant en définissant la relation entre chaque niveau.
Par conséquent, annulez MultiIndex pour en faire un seul index qui quitte la hiérarchie que vous souhaitez finalement récupérer, puis appliquez un filtre.
>>> df.reset_index(level=1)
level_1 val
1 a b
2 c d
3 a d
4 b c
5 a b
>>> tmp_df = df.reset_index(level=1).query("val=='b'")
>>> tmp_df.index
Int64Index([1, 5], dtype='int64')
Si vous faites cela, l'Index sera le même que l'élément du filtre, donc si vous voulez récupérer une certaine hiérarchie après le filtrage, vous devez correspondre avec reset_index
comme décrit ci-dessus.
Dans reset_index
, si le nom de colonne de MultiIndex est supprimé, spécifiez le nom, et sinon, spécifiez le numéro de la hiérarchie à libérer dans l'argument de level =
.
Recommended Posts