Bu çözümü tercih ediyorum:
col = df.pop("Mid")
df.insert(0, col.name, col)
Okuması daha kolay ve önerilen diğer yanıtlardan daha hızlı.
def move_column_inplace(df, col, pos):
col = df.pop(col)
df.insert(pos, col.name, col)
Performans değerlendirme:
Bu test için, şu anda son sütun her tekrarda öne taşınır. Yerinde yöntemler genellikle daha iyi performans gösterir. Citynorman'ın çözümü yerinde yapılabilirken, Ed .loc
Chum'un yöntemi ve sachinnm'in yöntemi reindex
olamaz.
Diğer yöntemler genel olmakla birlikte, citynorman'ın çözümü ile sınırlıdır pos=0
. Ben arasındaki herhangi bir performans farkı gözlemlemek vermedi df.loc[cols]
ve df[cols]
bazı diğer önerileri içermiyordu, bu yüzden de.
MacBook Pro'da (2015 Ortası) python 3.6.8 ve pandalar 0.24.2 ile test ettim.
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))
Sonuçlar :
%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
sütununu silmez . BunuGrouper
, aynı sütun iki kez oradayken gruplandırmaya çalışırken bir hata ile buldum .