Question Comment changer l'ordre des colonnes DataFrame?


J'ai ce qui suit DataFrame (df):

import numpy as np
import pandas as pd

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

J'ajoute plus de colonne (s) par affectation:

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

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


437
2017-10-30 22:22


origine


Réponses:


Un moyen simple serait de réassigner la trame de données avec une liste des colonnes, réorganisée au besoin.

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éarranger cols de quelque façon 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 dataframe 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

499
2017-10-30 22:38



Vous pourriez aussi faire quelque chose comme ceci:

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']

... qui est ensuite facile à réorganiser manuellement avant de le placer dans la première fonction


190
2018-05-19 15:20



Attribuez simplement les noms de colonne dans l'ordre que vous souhaitez:

In [39]: df
Out[39]: 
          0         1         2         3         4  mean
0  0.172742  0.915661  0.043387  0.712833  0.190717     1
1  0.128186  0.424771  0.590779  0.771080  0.617472     1
2  0.125709  0.085894  0.989798  0.829491  0.155563     1
3  0.742578  0.104061  0.299708  0.616751  0.951802     1
4  0.721118  0.528156  0.421360  0.105886  0.322311     1
5  0.900878  0.082047  0.224656  0.195162  0.736652     1
6  0.897832  0.558108  0.318016  0.586563  0.507564     1
7  0.027178  0.375183  0.930248  0.921786  0.337060     1
8  0.763028  0.182905  0.931756  0.110675  0.423398     1
9  0.848996  0.310562  0.140873  0.304561  0.417808     1

In [40]: df = df[['mean', 4,3,2,1]]

Maintenant, la colonne «moyenne» apparaît au premier plan:

In [41]: df
Out[41]: 
   mean         4         3         2         1
0     1  0.190717  0.712833  0.043387  0.915661
1     1  0.617472  0.771080  0.590779  0.424771
2     1  0.155563  0.829491  0.989798  0.085894
3     1  0.951802  0.616751  0.299708  0.104061
4     1  0.322311  0.105886  0.421360  0.528156
5     1  0.736652  0.195162  0.224656  0.082047
6     1  0.507564  0.586563  0.318016  0.558108
7     1  0.337060  0.921786  0.930248  0.375183
8     1  0.423398  0.110675  0.931756  0.182905
9     1  0.417808  0.304561  0.140873  0.310562

161
2018-04-28 14:19



Que diriez-vous:

df.insert(0, 'mean', df.mean(1))

http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion


78
2017-11-09 21:04



Dans ton cas,

df = df.reindex_axis(['mean',0,1,2,3,4], axis=1)

fera exactement ce que vous voulez.

Dans mon cas (forme générale):

df = df.reindex_axis(sorted(df.columns), axis=1)
df = df.reindex_axis(['opened'] + list([a for a in df.columns if a != 'opened']), axis=1)

mise à jour janvier 2018

Si vous voulez utiliser reindex: 

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))

42
2017-08-30 21:57



Vous devez créer une nouvelle liste de vos colonnes dans l’ordre souhaité, puis utiliser df = df[cols] réorganiser les colonnes dans ce nouvel ordre.

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]

Vous pouvez également utiliser une approche plus générale. Dans cet exemple, la dernière colonne (indiquée par -1) est insérée en tant que première colonne.

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]

Vous pouvez également utiliser cette approche pour réorganiser les colonnes dans l'ordre souhaité si elles sont présentes dans le DataFrame.

inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df] 
        + [col for col in df if col not in inserted cols])
df = df[cols]

20
2017-08-21 02:18



Simplement faire,

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

12
2018-04-28 09:50



Cette fonction vous évite d'avoir à lister toutes les variables de votre jeu de données pour n'en commander que 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 

Il faut deux arguments, le premier est le jeu de données, le second les colonnes du jeu de données que vous souhaitez mettre au premier plan.

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

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

Si je veux mettre Total et Date au premier plan, je fais:

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

MODIFIER:

Une autre façon utile d'utiliser ceci est, si vous avez une table non familière et vous recherchez avec des variables avec un terme particulier, comme VAR1, VAR2, ... vous pouvez exécuter quelque chose comme:

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

12
2017-07-29 19:30



J'ai moi-même rencontré une question similaire, et je voulais juste ajouter ce sur quoi je me suis arrêté. 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)

7
2017-08-27 19:49



Vous pourriez faire ce qui suit (emprunter des parties de la réponse d'Aman):

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]

6
2017-12-08 15:22