nombre insertar filtrar datos data columnas columna cambiar borrar agregar python pandas order

insertar - Python Pandas: reordenamiento de columnas en un marco de datos basado en el nombre de la columna



filtrar datos pandas (11)

El método de sorted y la función sorted permiten proporcionar una función personalizada para extraer la clave utilizada para la comparación:

>>> ls = [''Q1.3'', ''Q6.1'', ''Q1.2''] >>> sorted(ls, key=lambda x: float(x[1:])) [''Q1.2'', ''Q1.3'', ''Q6.1'']

Tengo un dataframe con más de 200 columnas (no preguntes por qué). El problema es que a medida que se generaron, el orden es

[''Q1.3'',''Q6.1'',''Q1.2'',''Q1.1'',......]

Necesito reordenar las columnas de la siguiente manera:

[''Q1.1'',''Q1.2'',''Q1.3'',.....''Q6.1'',......]

¿Hay alguna forma de que haga esto dentro de Python?


El método más rápido es:

df.sort_index(axis=1)

Tenga en cuenta que esto crea una nueva instancia. Por lo tanto, debe almacenar el resultado en una nueva variable:

sortedDf=df.sort_index(axis=1)


No olvide agregar "inplace = True" a la respuesta de Wes o establecer el resultado en un nuevo DataFrame.

df.sort_index(axis=1, inplace=True)


Para varias columnas, puede poner columnas para ordenar lo que desee:

#[''A'', ''B'', ''C''] <-this is your columns order df = df[[''C'', ''B'', ''A'']]

Este ejemplo muestra las columnas de clasificación y división:

d = {''col1'':[1, 2, 3], ''col2'':[4, 5, 6], ''col3'':[7, 8, 9], ''col4'':[17, 18, 19]} df = pandas.DataFrame(d)

Usted obtiene:

col1 col2 col3 col4 1 4 7 17 2 5 8 18 3 6 9 19

Entonces hazlo:

df = df[[''col3'', ''col2'', ''col1'']]

Resultando en:

col3 col2 col1 7 4 1 8 5 2 9 6 3


Puedes hacer:

df[sorted(df.columns)]


Si necesita una secuencia arbitraria en lugar de secuencia ordenada, puede hacer:

sequence = [''Q1.1'',''Q1.2'',''Q1.3'',.....''Q6.1'',......] your_dataframe = your_dataframe.reindex(columns=sequence)

Probé esto en 2.7.10 y funcionó para mí.


También puedes hacer más sucintamente:

df.sort_index(axis=1)

Editar :

Asegúrate de mantener el valor

df = df.sort_index(axis=1)

O hazlo en su lugar

df.sort_index(axis=1, inplace=True)


Un caso de uso es que ha nombrado (algunas de) sus columnas con algún prefijo, y desea que las columnas se clasifiquen con esos prefijos todos juntos y en algún orden particular (no alfabético).

Por ejemplo, puede comenzar todas sus funciones con Ft_ , etiquetas con Lbl_ , etc., y desea primero todas las columnas no prefijadas, luego todas las características, luego la etiqueta. Puedes hacer esto con la siguiente función (notaré un posible problema de eficiencia usando la sum para reducir las listas, pero esto no es un problema a menos que tengas MUCHAS columnas, que no).

def sortedcols(df, groups = [''Ft_'', ''Lbl_''] ): return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: [''^(?!(%s))'' % ''|''.join(l)] + [''^%s'' % i for i in l ] )(groups) ], []) ]


La respuesta de Tweet se puede pasar a la respuesta de BrenBarn anterior con

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

Entonces para su ejemplo, diga:

vals = randint(low=16, high=80, size=25).reshape(5,5) cols = [''Q1.3'', ''Q6.1'', ''Q1.2'', ''Q9.1'', ''Q10.2''] data = DataFrame(vals, columns = cols)

Usted obtiene:

data Q1.3 Q6.1 Q1.2 Q9.1 Q10.2 0 73 29 63 51 72 1 61 29 32 68 57 2 36 49 76 18 37 3 63 61 51 30 31 4 36 66 71 24 77

Entonces hazlo:

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

Resultando en:

data Q1.2 Q1.3 Q6.1 Q9.1 Q10.2 0 2 0 1 3 4 1 7 5 6 8 9 2 2 0 1 3 4 3 2 0 1 3 4 4 2 0 1 3 4


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

Esto supone que ordenar los nombres de las columnas dará el orden que desee. Si los nombres de sus columnas no se ordenarán lexicográficamente (por ejemplo, si desea que la columna Q10.3 aparezca después de Q9.1), deberá ordenar de forma diferente, pero eso no tiene nada que ver con los pandas.


print df.sort_index(by=''Frequency'',ascending=False)

donde por es el nombre de la columna, si desea ordenar el conjunto de datos basado en la columna