Ini df saya:
Net Upper Lower Mid Zsore
Answer option
More than once a day 0% 0.22% -0.12% 2 65
Once a day 0% 0.32% -0.19% 3 45
Several times a week 2% 2.45% 1.10% 4 78
Once a week 1% 1.63% -0.40% 6 65
Bagaimana cara memindahkan kolom dengan nama ( "Mid"
) ke depan tabel, indeks 0. Hasilnya akan terlihat seperti ini:
Mid Upper Lower Net Zsore
Answer option
More than once a day 2 0.22% -0.12% 0% 65
Once a day 3 0.32% -0.19% 0% 45
Several times a week 4 2.45% 1.10% 2% 78
Once a week 6 1.63% -0.40% 1% 65
Kode saya saat ini memindahkan kolom dengan menggunakan indeks df.columns.tolist()
tetapi saya ingin menggantinya dengan nama.
Mid
&Zscore
dari kolom dari posisi semula. Saya menemukan ini denganGrouper
kesalahan saat mencoba mengelompokkan ketika kolom yang sama ada dua kali.Anda dapat menggunakan fungsi df.reindex () di pandas. df adalah
Net Upper Lower Mid Zsore Answer option More than once a day 0% 0.22% -0.12% 2 65 Once a day 0% 0.32% -0.19% 3 45 Several times a week 2% 2.45% 1.10% 4 78 Once a week 1% 1.63% -0.40% 6 65
tentukan daftar nama kolom
cols = df.columns.tolist() cols Out[13]: ['Net', 'Upper', 'Lower', 'Mid', 'Zsore']
pindahkan nama kolom ke mana pun Anda inginkan
cols.insert(0, cols.pop(cols.index('Mid'))) cols Out[16]: ['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
kemudian gunakan
df.reindex()
fungsi untuk menyusun ulangout put adalah: df
Mid Upper Lower Net Zsore Answer option More than once a day 2 0.22% -0.12% 0% 65 Once a day 3 0.32% -0.19% 0% 45 Several times a week 4 2.45% 1.10% 2% 78 Once a week 6 1.63% -0.40% 1% 65
sumber
Saya lebih suka solusi ini:
col = df.pop("Mid") df.insert(0, col.name, col)
Ini lebih mudah dibaca dan lebih cepat daripada jawaban yang disarankan lainnya.
def move_column_inplace(df, col, pos): col = df.pop(col) df.insert(pos, col.name, col)
Penilaian kinerja:
Untuk pengujian ini, kolom terakhir saat ini dipindahkan ke depan di setiap pengulangan. Metode di tempat biasanya bekerja lebih baik. Sementara solusi citynorman dapat dibuat di tempat, metode Ed Chum berdasarkan
.loc
dan metode sachinnm berdasarkanreindex
tidak bisa.Sementara metode lain bersifat umum, solusi citynorman terbatas pada
pos=0
. Saya tidak mengamati perbedaan kinerja apa pun antaradf.loc[cols]
dandf[cols]
, itulah sebabnya saya tidak menyertakan beberapa saran lain.Saya menguji dengan python 3.6.8 dan pandas 0.24.2 di MacBook Pro (Pertengahan 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] # or df.loc[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): # This approach exploits that reset_index() moves the index # at the first position of the data frame. 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 equivalence of solutions. 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))
Hasil :
# For n_cols = 11: %timeit test(move_to_front_normanius_inplace, df) # 1.05 ms ± 42.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) %timeit test(move_to_front_citynorman_inplace, df) # 1.68 ms ± 46.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) %timeit test(move_to_front_sachinmm, df) # 3.24 ms ± 96.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_chum, df) # 3.84 ms ± 114 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_elpastor, df) # 3.85 ms ± 58.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_chum_inplace, df) # 9.67 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) # For n_cols = 31: %timeit test(move_to_front_normanius_inplace, df) # 1.26 ms ± 31.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_citynorman_inplace, df) # 1.95 ms ± 260 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_sachinmm, df) # 10.7 ms ± 348 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_chum, df) # 11.5 ms ± 869 µs per loop (mean ± std. dev. of 7 runs, 100 loops each %timeit test(move_to_front_elpastor, df) # 11.4 ms ± 598 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit test(move_to_front_chum_inplace, df) # 31.4 ms ± 1.89 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
sumber
df = df.insert(0, col.name, col)
, kita perlu melakukannyadf.insert(0, col.name, col)
. Anda memilikinya dengan benar dalam fungsinyamove_column_inplace()
.Saya tidak suka bagaimana saya harus secara eksplisit menentukan semua kolom lain di solusi lain jadi ini bekerja paling baik untuk saya. Meskipun mungkin lambat untuk kerangka data besar ...?
df = df.set_index('Mid').reset_index()
sumber
reset_index()
memasukkan indeks yang dijatuhkan di posisi pertama. Namun, perhatikan bahwa perilaku ini tidak ditentukan di dokumen .inplace=True
untukset_index()
danreset_index()
.Berikut ini sekumpulan kode umum yang sering saya gunakan untuk mengatur ulang posisi kolom. Anda mungkin merasa berguna.
cols = df.columns.tolist() n = int(cols.index('Mid')) cols = [cols[n]] + cols[:n] + cols[n+1:] df = df[cols]
sumber
Untuk menyusun ulang baris DataFrame cukup gunakan daftar sebagai berikut.
df = df[['Mid', 'Net', 'Upper', 'Lower', 'Zsore']]
Ini membuatnya sangat jelas apa yang dilakukan saat membaca kode nanti. Juga gunakan:
df.columns Out[1]: Index(['Net', 'Upper', 'Lower', 'Mid', 'Zsore'], dtype='object')
Kemudian potong dan tempel untuk menyusun ulang.
Untuk DataFrame dengan banyak kolom, simpan daftar kolom dalam variabel dan pop kolom yang diinginkan ke depan daftar. Berikut ini contohnya:
cols = [str(col_name) for col_name in range(1001)] data = np.random.rand(10,1001) df = pd.DataFrame(data=data, columns=cols) mv_col = cols.pop(cols.index('77')) df = df[[mv_col] + cols]
Sekarang
df.columns
punya.Index(['77', '0', '1', '2', '3', '4', '5', '6', '7', '8', ... '991', '992', '993', '994', '995', '996', '997', '998', '999', '1000'], dtype='object', length=1001)
sumber
Inilah jawaban yang sangat sederhana untuk ini.
Jangan lupa dua (()) 'tanda kurung' di sekitar nama kolom. Jika tidak, itu akan memberi Anda kesalahan.
# here you can add below line and it should work df = df[list(('Mid','Upper', 'Lower', 'Net','Zsore'))] df Mid Upper Lower Net Zsore Answer option More than once a day 2 0.22% -0.12% 0% 65 Once a day 3 0.32% -0.19% 0% 45 Several times a week 4 2.45% 1.10% 2% 78 Once a week 6 1.63% -0.40% 1% 65
sumber
Hal paling sederhana yang dapat Anda coba adalah:
df=df[[ 'Mid', 'Upper', 'Lower', 'Net' , 'Zsore']]
sumber