Si j'ai un index de colonne à plusieurs niveaux:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
une --- + - b | c - + --- + - 0 | 1 | 2 1 | 3 | 4
Comment puis-je supprimer le niveau "a" de cet index, donc je me retrouve avec:
b | c - + --- + - 0 | 1 | 2 1 | 3 | 4
droplevel
les travaux peuvent fonctionner sur des index ou des colonnes à plusieurs niveaux via le paramètreaxis
.Réponses:
Vous pouvez utiliser
MultiIndex.droplevel
:la source
>>> df.columns = df.columns.droplevel(0)
>>> df.index = df.index.droplevel(1)
df.columns.droplevel()
n'est plus disponible.>>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
Une autre façon de supprimer l'index est d'utiliser une compréhension de liste:
Cette stratégie est également utile si vous souhaitez combiner les noms des deux niveaux comme dans l'exemple ci-dessous où le niveau inférieur contient deux «y»:
La suppression du niveau supérieur laisserait deux colonnes avec l'index «y». Cela peut être évité en joignant les noms à la compréhension de la liste.
C'est un problème que j'ai eu après avoir fait un groupe et il a fallu un certain temps pour trouver cette autre question qui l'a résolu. J'ai adapté cette solution au cas spécifique ici.
la source
[col[1] for col in df.columns]
est plus directementdf.columns.get_level_values(1)
.[col[0] if col[1] == '' else col[1] for col in df.columns]
Une autre façon de procéder consiste à réaffecter en
df
fonction d'une section transversale dedf
, en utilisant la méthode .xs .la source
b
), puis laisser tomber ce niveau et se retrouver avec le premier niveau (a
), ce qui suit fonctionnerait:df = df.xs('b', axis=1, level=1, drop_level=True)
Depuis Pandas 0.24.0 , nous pouvons maintenant utiliser DataFrame.droplevel () :
Ceci est très utile si vous souhaitez maintenir le roulement de votre chaîne de méthodes DataFrame.
la source
Vous pouvez également y parvenir en renommant les colonnes:
df.columns = ['a', 'b']
Cela implique une étape manuelle, mais pourrait être une option, surtout si vous renommez éventuellement votre bloc de données.
la source
df.columns.get_level_values(1)
.Un petit truc en utilisant
sum
avec level = 1 (fonctionne quand level = 1 est unique)Solution plus courante
get_level_values
la source
J'ai eu du mal avec ce problème car je ne sais pas pourquoi ma fonction droplevel () ne fonctionne pas. Parcourez plusieurs et découvrez que «a» dans votre table est le nom des colonnes et «b», «c» sont index. Faire comme ça vous aidera
la source