781 votos

¿Cómo cambiar el orden de las columnas del DataFrame?

Tengo lo siguiente DataFrame ( df ):

import numpy as np
import pandas as pd

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

Agrego más columna(s) por asignación:

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

Cómo puedo mover la columna mean al frente, es decir, ponerla como primera columna dejando el orden de las otras columnas intacto?

768voto

Aman Puntos 3440

Una manera fácil sería reasignar el marco de datos con una lista de las columnas, reordenadas según sea necesario.

Esto es lo que tienes ahora:

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

Reacomodar cols de la forma que quieras. Así es como he movido el último elemento a la primera posición:

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

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

Entonces reordena el marco de datos así:

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

389voto

freddygv Puntos 61

También puedes hacer algo así:

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

Puede obtener la lista de columnas con:

cols = list(df.columns.values)

La salida producirá:

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

...que luego es fácil de reordenar manualmente antes de soltarlo en la primera función

121voto

Wes McKinney Puntos 17545

Que tal:

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

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

16voto

seeiespi Puntos 48
def order(frame,var):
    varlist =[w for w in frame.columns if w not in var]
    frame = frame[var+varlist]
    return frame 

Esta función toma dos argumentos, el primero es el conjunto de datos, el segundo son las columnas del conjunto de datos que se quieren traer al frente.

Así que en mi caso tengo un conjunto de datos llamado Marco con las variables A1, A2, B1, B2, Total y Fecha. Si quiero traer el Total al frente entonces todo lo que tengo que hacer es

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

Si quiero llevar el Total y la Fecha al frente, entonces lo hago:

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

4voto

dmvianna Puntos 1671

Esta pregunta ha sido respondida antes de :

df.reindex_axis(sorted(df.columns), axis=1)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X