1259 votes

Comment changer l'ordre des colonnes d'un DataFrame ?

J'ai les éléments suivants DataFrame ( df ) :

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))

J'ajoute une ou plusieurs colonnes par mission :

df['mean'] = df.mean(1)

Comment puis-je déplacer la colonne mean à l'avant, c'est-à-dire la mettre en première colonne en laissant l'ordre des autres colonnes intact ?

1 votes

Pour une solution généralisée basée sur NumPy, voir Comment déplacer une colonne dans un cadre de données pandas ? suppose un seul niveau de colonne, c'est-à-dire qu'il n'y a pas de niveau de colonne. MultiIndex .

0 votes

Après avoir cherché suffisamment, j'ai obtenu ce meilleur lien pour les colonnes réarrangeant plusieurs logiques en termes assez simples [colonnes réarrangeant la logique pour pandas] [ datasciencemadesimple.com/

1138voto

Aman Points 3440

Une solution simple serait de réaffecter le cadre de données avec une liste de colonnes, réorganisées selon les besoins.

C'est ce que vous avez maintenant :

In [6]: df
Out[6]:
          0         1         2         3         4      mean
0  0.445598  0.173835  0.343415  0.682252  0.582616  0.445543
1  0.881592  0.696942  0.702232  0.696724  0.373551  0.670208
2  0.662527  0.955193  0.131016  0.609548  0.804694  0.632596
3  0.260919  0.783467  0.593433  0.033426  0.512019  0.436653
4  0.131842  0.799367  0.182828  0.683330  0.019485  0.363371
5  0.498784  0.873495  0.383811  0.699289  0.480447  0.587165
6  0.388771  0.395757  0.745237  0.628406  0.784473  0.588529
7  0.147986  0.459451  0.310961  0.706435  0.100914  0.345149
8  0.394947  0.863494  0.585030  0.565944  0.356561  0.553195
9  0.689260  0.865243  0.136481  0.386582  0.730399  0.561593

In [7]: cols = df.columns.tolist()

In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']

Réarrangez cols de la manière que vous voulez. Voici comment j'ai déplacé le dernier élément vers la première position :

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]

Puis réorganisez le cadre de données comme ceci :

In [16]: df = df[cols]  #    OR    df = df.ix[:, cols]

In [17]: df
Out[17]:
       mean         0         1         2         3         4
0  0.445543  0.445598  0.173835  0.343415  0.682252  0.582616
1  0.670208  0.881592  0.696942  0.702232  0.696724  0.373551
2  0.632596  0.662527  0.955193  0.131016  0.609548  0.804694
3  0.436653  0.260919  0.783467  0.593433  0.033426  0.512019
4  0.363371  0.131842  0.799367  0.182828  0.683330  0.019485
5  0.587165  0.498784  0.873495  0.383811  0.699289  0.480447
6  0.588529  0.388771  0.395757  0.745237  0.628406  0.784473
7  0.345149  0.147986  0.459451  0.310961  0.706435  0.100914
8  0.553195  0.394947  0.863494  0.585030  0.565944  0.356561
9  0.561593  0.689260  0.865243  0.136481  0.386582  0.730399

26 votes

Au cas où vous obtiendriez "cannot concatenate 'str' and 'list' objects", assurez-vous que vous [] la valeur str dans cols : cols = [cols[7]] + cols[:7] + cols[8 :] + cols[:7] + cols[8 :]

1 votes

Y a-t-il une raison d'utiliser df.ix[:, cols] sur df[cols] ?

1 votes

FutureWarning: using '+' to provide set union with Indexes is deprecated, use '|' or .union() ''' . Je suggère de remplacer le cols ligne avec cols[-1:].union(cols[:-1]) ce qui donne le même résultat.

668voto

freddygv Points 61

Vous pourriez aussi faire quelque chose comme ça :

df = df[['mean', '0', '1', '2', '3']]

Vous pouvez obtenir la liste des colonnes avec :

cols = list(df.columns.values)

La sortie produira :

['0', '1', '2', '3', 'mean']

...qu'il est ensuite facile de réorganiser manuellement avant de le placer dans la première fonction.

9 votes

Vous pouvez également obtenir la liste des colonnes avec list(df.columns)

21 votes

Ou df.columns.tolist()

0 votes

Pour les débutants comme moi, réorganisez la liste que vous obtenez à partir des cols. Ensuite, df=df[cols], c'est-à-dire que la liste réarrangée est déposée dans la première expression sans un seul jeu de parenthèses.

202voto

Wes McKinney Points 17545

59 votes

Pourrait-il s'agir d'une future fonctionnalité ajoutée à pandas ? quelque chose comme df.move(0,df.mean) ?

0 votes

Oh mec, ça marche même comme ça df_metadata.insert(0,'Db_name',"raw_data") (Code non pertinent pour ce fil de discussion)

5 votes

Magnifique. Et ça se passe sur place, aussi.

21voto

Mahmud Points 16

Je me suis moi-même posé une question similaire, et je voulais juste ajouter ce que j'ai décidé. J'ai aimé le reindex_axis() method pour changer l'ordre des colonnes. Cela a fonctionné :

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

Une méthode alternative basée sur le commentaire de @Jorge :

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

Bien que reindex_axis semble être un peu plus rapide dans les micro-benchmarks que le reindex Je crois que je préfère la seconde pour son côté direct.

7 votes

C'était une bonne solution, mais reindex_axis sera déprécié. J'ai utilisé reindex, et ça a très bien fonctionné.

0 votes

Je peux manquer quelque chose mais 1/ vous avez probablement oublié d'inclure axis=1 dans cette deuxième solution d'utiliser les colonnes et non les lignes. 2/ En 2020, le reindex modifie l'ordre des lignes/colonnes, mais efface également les données ( NaN partout).

19voto

seeiespi Points 48

Cette fonction vous évite d'avoir à énumérer toutes les variables de votre ensemble de données juste pour en ordonner quelques-unes.

def order(frame,var):
    if type(var) is str:
        var = [var] #let the command take a string or list
    varlist =[w for w in frame.columns if w not in var]
    frame = frame[var+varlist]
    return frame 

Elle prend deux arguments, le premier est l'ensemble de données, le second sont les colonnes de l'ensemble de données que vous voulez mettre en avant.

Dans mon cas, j'ai un ensemble de données appelé Cadre avec les variables A1, A2, B1, B2, Total et Date. Si je veux mettre Total en avant, tout ce que j'ai à faire est de :

frame = order(frame,['Total'])

Si je veux mettre le total et la date à l'avant, je le fais :

frame = order(frame,['Total','Date'])

EDIT :

Une autre façon utile d'utiliser ceci est, si vous avez un tableau inconnu et que vous cherchez des variables avec un terme particulier dans celles-ci, comme VAR1, VAR2, ... vous pouvez exécuter quelque chose comme :

frame = order(frame,[v for v in frame.columns if "VAR" in v])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X