Prefiero esta solución:
col = df.pop("Mid")
df.insert(0, col.name, col)
Es más sencillo de leer y más rápido que otras respuestas sugeridas.
def move_column_inplace(df, col, pos):
col = df.pop(col)
df.insert(pos, col.name, col)
Evaluación del desempeño:
Para esta prueba, la última columna actual se mueve al frente en cada repetición. Los métodos in situ generalmente funcionan mejor. Si bien la solución de citynorman se puede realizar en el lugar, el método de Ed Chum basado en .loc
y el método de sachinnm basado en reindex
no puede.
Mientras que otros métodos son genéricos, la solución de citynorman se limita a pos=0
. No observé ninguna diferencia de rendimiento entre df.loc[cols]
y df[cols]
, razón por la cual no incluí otras sugerencias.
Probé con python 3.6.8 y pandas 0.24.2 en una MacBook Pro (mediados de 2015).
import numpy as np
import pandas as pd
n_cols = 11
df = pd.DataFrame(np.random.randn(200000, n_cols),
columns=range(n_cols))
def move_column_inplace(df, col, pos):
col = df.pop(col)
df.insert(pos, col.name, col)
def move_to_front_normanius_inplace(df, col):
move_column_inplace(df, col, 0)
return df
def move_to_front_chum(df, col):
cols = list(df)
cols.insert(0, cols.pop(cols.index(col)))
return df.loc[:, cols]
def move_to_front_chum_inplace(df, col):
col = df[col]
df.drop(col.name, axis=1, inplace=True)
df.insert(0, col.name, col)
return df
def move_to_front_elpastor(df, col):
cols = [col] + [ c for c in df.columns if c!=col ]
return df[cols]
def move_to_front_sachinmm(df, col):
cols = df.columns.tolist()
cols.insert(0, cols.pop(cols.index(col)))
df = df.reindex(columns=cols, copy=False)
return df
def move_to_front_citynorman_inplace(df, col):
df.set_index(col, inplace=True)
df.reset_index(inplace=True)
return df
def test(method, df):
col = np.random.randint(0, n_cols)
method(df, col)
col = np.random.randint(0, n_cols)
ret_mine = move_to_front_normanius_inplace(df.copy(), col)
ret_chum1 = move_to_front_chum(df.copy(), col)
ret_chum2 = move_to_front_chum_inplace(df.copy(), col)
ret_elpas = move_to_front_elpastor(df.copy(), col)
ret_sach = move_to_front_sachinmm(df.copy(), col)
ret_city = move_to_front_citynorman_inplace(df.copy(), col)
assert(ret_mine.equals(ret_chum1))
assert(ret_mine.equals(ret_chum2))
assert(ret_mine.equals(ret_elpas))
assert(ret_mine.equals(ret_sach))
assert(ret_mine.equals(ret_city))
Resultados :
%timeit test(move_to_front_normanius_inplace, df)
%timeit test(move_to_front_citynorman_inplace, df)
%timeit test(move_to_front_sachinmm, df)
%timeit test(move_to_front_chum, df)
%timeit test(move_to_front_elpastor, df)
%timeit test(move_to_front_chum_inplace, df)
%timeit test(move_to_front_normanius_inplace, df)
%timeit test(move_to_front_citynorman_inplace, df)
%timeit test(move_to_front_sachinmm, df)
%timeit test(move_to_front_chum, df)
%timeit test(move_to_front_elpastor, df)
%timeit test(move_to_front_chum_inplace, df)
Mid
&Zscore
de la columna de la posición original. Descubrí esto con unGrouper
error al intentar agrupar por cuando la misma columna estaba allí dos veces.