Tôi thích giải pháp này hơn:
col = df.pop("Mid")
df.insert(0, col.name, col)
Nó đơn giản hơn để đọc và nhanh hơn các câu trả lời được đề xuất khác.
def move_column_inplace(df, col, pos):
col = df.pop(col)
df.insert(pos, col.name, col)
Đánh giá hiệu suất:
Đối với thử nghiệm này, cột cuối cùng hiện tại được chuyển lên phía trước trong mỗi lần lặp lại. Các phương pháp tại chỗ thường hoạt động tốt hơn. Trong khi giải pháp của citynorman có thể được thực hiện tại chỗ, phương pháp của Ed Chum dựa trên .loc
và phương pháp của sachinnm dựa trên reindex
không thể.
Trong khi các phương pháp khác là chung chung, giải pháp của citynorman chỉ giới hạn ở pos=0
. Tôi không quan sát thấy bất kỳ sự khác biệt hiệu suất nào giữa df.loc[cols]
và df[cols]
, đó là lý do tại sao tôi không đưa vào một số đề xuất khác.
Tôi đã thử nghiệm với python 3.6.8 và pandas 0.24.2 trên MacBook Pro (giữa năm 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))
Kết quả :
%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
khỏi cột khỏi vị trí ban đầu. Tôi phát hiện ra điều này vớiGrouper
lỗi khi cố gắng nhóm theo cùng một cột ở đó hai lần.