Вот мой df:
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
Как мне переместить столбец по имени ( "Mid"
) в начало таблицы, индекс 0. Вот как должен выглядеть результат:
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
В моем текущем коде столбец перемещается по индексу, df.columns.tolist()
но я бы хотел сместить его по имени.
Mid
&Zscore
из столбца из исходной позиции. Я обнаружил это сGrouper
ошибкой при попытке группировки, когда один и тот же столбец был там дважды.Вы можете использовать функцию df.reindex () в пандах. df это
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
определить список имен столбцов
cols = df.columns.tolist() cols Out[13]: ['Net', 'Upper', 'Lower', 'Mid', 'Zsore']
переместите имя столбца куда хотите
cols.insert(0, cols.pop(cols.index('Mid'))) cols Out[16]: ['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
затем используйте
df.reindex()
функцию, чтобы изменить порядоквывод: 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
источник
Я предпочитаю это решение:
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] # 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))
Результаты :
# 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)
источник
df = df.insert(0, col.name, col)
нам нужно делатьdf.insert(0, col.name, col)
. Однако у вас это правильно в функцииmove_column_inplace()
.Мне не понравилось, как мне пришлось явно указывать все остальные столбцы в других решениях, поэтому это сработало для меня лучше всего. Хотя это может быть медленным для больших фреймов данных ...?
df = df.set_index('Mid').reset_index()
источник
reset_index()
вставки отброшенного индекса в первую позицию. Обратите внимание, однако, что это поведение не указано в документации .inplace=True
для,set_index()
и дляreset_index()
.Вот общий набор кода, который я часто использую для изменения положения столбцов. Вы можете найти это полезным.
cols = df.columns.tolist() n = int(cols.index('Mid')) cols = [cols[n]] + cols[:n] + cols[n+1:] df = df[cols]
источник
Чтобы изменить порядок строк DataFrame, просто используйте список, как показано ниже.
df = df[['Mid', 'Net', 'Upper', 'Lower', 'Zsore']]
Это делает очень очевидным, что было сделано при чтении кода позже. Также используйте:
df.columns Out[1]: Index(['Net', 'Upper', 'Lower', 'Mid', 'Zsore'], dtype='object')
Затем вырежьте и вставьте, чтобы изменить порядок.
Для DataFrame с множеством столбцов сохраните список столбцов в переменной и вставьте нужный столбец в начало списка. Вот пример:
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]
Теперь
df.columns
есть.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)
источник
Вот на это очень простой ответ.
Не забывайте о двух скобках (()) вокруг имен столбцов, иначе вы получите ошибку.
# 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
источник
Самое простое, что вы можете попробовать:
df=df[[ 'Mid', 'Upper', 'Lower', 'Net' , 'Zsore']]
источник