ฉันชอบวิธีนี้:
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 สามารถทำได้ในสถานที่ แต่วิธีการของ Ed Chum ตาม.loc
และวิธีการของ sachinnm ตามreindex
ไม่สามารถทำได้
ในขณะที่วิธีการอื่น ๆ เป็นวิธีการทั่วไป แต่โซลูชันของ citynorman จำกัดpos=0
อยู่ที่ ฉันไม่ได้สังเกตความแตกต่างของประสิทธิภาพระหว่างdf.loc[cols]
และdf[cols]
ด้วยเหตุนี้ฉันจึงไม่ได้ให้คำแนะนำอื่น ๆ
ฉันทดสอบด้วย python 3.6.8 และแพนด้า 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
ข้อผิดพลาดในการพยายามจัดกลุ่มเมื่อมีคอลัมน์เดียวกันสองครั้ง