Tengo lo siguiente DataFrame
( df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
Agrego más columnas por asignación:
df['mean'] = df.mean(1)
¿Cómo puedo mover la columna mean
al frente, es decir, establecerla como primera columna, dejando intacto el orden de las otras columnas?
MultiIndex
.Respuestas:
Una manera fácil sería reasignar el marco de datos con una lista de las columnas, reorganizadas según sea necesario.
Esto es lo que tienes ahora:
Reorganice
cols
de la forma que desee. Así es como moví el último elemento a la primera posición:Luego reordene el marco de datos de esta manera:
fuente
cols
eslist
; incluso permite duplicados (que se descartarán cuando se usen en el marco de datos). Estás pensando enIndex
objetos.También podrías hacer algo como esto:
Puede obtener la lista de columnas con:
La salida producirá:
... que luego es fácil de reorganizar manualmente antes de colocarlo en la primera función
fuente
df.columns.tolist()
df = df[['mean1', 0, 1, 2, 3]]
✓pd.read_csv()
. ¿Cómo se puede usar su respuesta para cambiar el orden de las columnas?Simplemente asigne los nombres de las columnas en el orden que desee:
Ahora, la columna 'media' sale al frente:
fuente
<df>.columns
que reclamas inicialmenteQué tal si:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
fuente
pandas
? algo asídf.move(0,df.mean)
?df_metadata.insert(0,'Db_name',"raw_data")
(Código no relevante para este hilo)*** ValueError: cannot insert mean, already exists
En tu caso,
Hará exactamente lo que quieras.
En mi caso (forma general):
fuente
copy=False
pero parece quereindex_axis
todavía crea una copia.Debe crear una nueva lista de sus columnas en el orden deseado, luego usar
df = df[cols]
para reorganizar las columnas en este nuevo orden.También puede usar un enfoque más general. En este ejemplo, la última columna (indicada por -1) se inserta como la primera columna.
También puede usar este enfoque para reordenar las columnas en el orden deseado si están presentes en el Marco de datos.
fuente
Puede probar las siguientes soluciones:
Solución 1:
Solución 2:
Solución 3:
Solución 4:
Solución 5:
solución 6:
Comparación de tiempo:
Solución 1:
Solución 2 :
Solución 3 :
Solución 4 :
Solución 5 :
Solución 6 :
fuente
df = df.iloc[:, [1, 2, 3, 0]]
Desde agosto de 2018:
Si los nombres de columna son demasiado largos para escribir, puede especificar el nuevo orden a través de una lista de enteros con las posiciones:
Datos:
Ejemplo genérico:
Y para el caso específico de la pregunta de OP:
El principal problema con este enfoque es que llamar al mismo código varias veces creará resultados diferentes cada vez, por lo que hay que tener cuidado :)
fuente
Esta función evita que tenga que enumerar todas las variables en su conjunto de datos solo para ordenar algunas de ellas.
Se necesitan dos argumentos, el primero es el conjunto de datos, el segundo son las columnas del conjunto de datos que desea traer al frente.
Entonces, en mi caso, tengo un conjunto de datos llamado Frame con las variables A1, A2, B1, B2, Total y Fecha. Si quiero llevar a Total al frente, todo lo que tengo que hacer es:
Si quiero traer Total y Date al frente, entonces lo hago:
EDITAR:
Otra forma útil de usar esto es, si tiene una tabla desconocida y está buscando variables con un término particular en ellas, como VAR1, VAR2, ... puede ejecutar algo como:
fuente
Me encontré con una pregunta similar, y solo quería agregar lo que resolví. Me gustó el
reindex_axis() method
para cambiar el orden de las columnas. Esto funcionó:Un método alternativo basado en el comentario de @Jorge:
Aunque
reindex_axis
parece ser un poco más rápido en micro benchmarks quereindex
, creo que prefiero el último por su franqueza.fuente
Simplemente hazlo
fuente
order = df.columns.tolist()
df['mean'] = df.mean(1)
df.columns = ['mean'] + order
headers
, que se usó para crear un dict que luego se usó para crear el DataFrame, llamédf.reindex(columns=headers)
. El único problema con el que me encontré fue que ya había llamadodf.set_index('some header name', inplace=True)
, por lo que cuando se realizó la reindexación, se agregó otra columna llamadasome header name
ya que la columna original ahora era el índice. En cuanto a la sintaxis especificada anteriormente,['mean'] + df.columns
en el intérprete de Python me daIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
Puede hacer lo siguiente (tomar prestadas partes de la respuesta de Aman):
fuente
Simplemente escriba el nombre de la columna que desea cambiar y configure el índice para la nueva ubicación.
Para su caso, esto sería como:
fuente
Mover cualquier columna a cualquier posición:
fuente
Creo que esta es una solución un poco más ordenada:
Esta solución es algo similar a la solución de @JoeHeffer pero esta es una línea.
Aquí eliminamos la columna
"mean"
del marco de datos y la adjuntamos al índice0
con el mismo nombre de columna.fuente
Aquí hay una manera de mover una columna existente que modificará el marco de datos existente en su lugar.
fuente
Esta pregunta se ha respondido antes, pero reindex_axis está en desuso ahora, por lo que sugeriría usar:
fuente
¿Qué tal el uso de "T"?
fuente
@clocker: Su solución fue muy útil para mí, ya que quería traer dos columnas al frente de un marco de datos donde no conozco exactamente los nombres de todas las columnas, porque se generan a partir de una declaración dinámica antes. Por lo tanto, si se encuentra en la misma situación: para traer columnas al frente de las que conoce el nombre y luego dejar que sigan "todas las otras columnas", se me ocurrió la siguiente solución general;
fuente
set()
:Se está utilizando un enfoque simple
set()
, en particular cuando tiene una larga lista de columnas y no desea manejarlas manualmente:fuente
Me gustó la respuesta de Shoresh para usar la funcionalidad de conjunto para eliminar columnas cuando no se conoce la ubicación, sin embargo, esto no funcionó para mi propósito, ya que necesito mantener el orden original de las columnas (que tiene etiquetas de columnas arbitrarias).
Sin embargo, conseguí que esto funcionara usando IndexedSet del paquete de boltons.
También necesitaba volver a agregar varias etiquetas de columna, por lo que para un caso más general utilicé el siguiente código:
Espero que esto sea útil para cualquiera que busque en este hilo una solución general.
fuente
set
para este propósito con bastante frecuencia y nunca tuve que lidiar con los pedidos.Puede usar
reindex
cuál puede usarse para ambos ejes:fuente
Aquí hay una función para hacer esto para cualquier número de columnas.
fuente
Método más hack en el libro
fuente
Creo que esta función es más sencilla. Solo necesita especificar un subconjunto de columnas al principio o al final o ambos:
fuente
Creo que la respuesta de @ Aman es la mejor si conoce la ubicación de la otra columna.
Si no conoce la ubicación de
mean
, pero solo tiene su nombre, no puede recurrir directamentecols = cols[-1:] + cols[:-1]
. Lo siguiente es lo mejor que se me ocurre:fuente
Simplemente voltear ayuda a menudo.
O simplemente baraja para echar un vistazo.
fuente
La mayoría de las respuestas no se generalizaron lo suficiente y el método pandas reindex_axis es un poco tedioso, por lo tanto, ofrezco una función simple para mover un número arbitrario de columnas a cualquier posición usando un diccionario donde clave = nombre de columna y valor = posición para mover. Si su marco de datos es grande, pase True a 'big_data', entonces la función devolverá la lista de columnas ordenadas. Y podría usar esta lista para cortar sus datos.
fuente
Tengo un caso de uso muy específico para reordenar nombres de columnas en pandas. A veces estoy creando una nueva columna en un marco de datos que se basa en una columna existente. Por defecto, los pandas insertarán mi nueva columna al final, pero quiero que la nueva columna se inserte junto a la columna existente de la que deriva.
fuente
Una solución bastante sencilla que funcionó para mí es usar .reindex en df.columns:
fuente