Я віддаю перевагу такому рішенню:
col = df.pop("Mid")
df.insert(0, col.name, col)
Його читати простіше і швидше, ніж інші запропоновані відповіді.
def move_column_inplace(df, col, pos):
col = df.pop(col)
df.insert(pos, col.name, col)
Оцінка ефективності:
Для цього тесту поточний останній стовпець переміщується вперед у кожному повторенні. Як правило, ефективні методи працюють краще. Хоча рішення citynorman можна зробити на місці, метод Еда Чума, заснований на, .loc
і метод sachinnm, заснований на reindex
не може.
Хоча інші методи є загальними, рішення citynorman обмежується pos=0
. Я не спостерігав жодної різниці в продуктивності між df.loc[cols]
і df[cols]
, саме тому я не включав деякі інші пропозиції.
Я тестував на python 3.6.8 і pandas 0.24.2 на MacBook Pro (середина 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))
Результати :
%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
зі стовпця з вихідної позиції. Я дізнався про це зGrouper
помилкою при спробі групуватися, коли той самий стовпець був там двічі.