Подтвердить что ты не робот

Переместить столбец по имени в начало таблицы в pandas

Вот мой 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

Как я могу переместить столбец по имени ( "Середина" ) в начало таблицы, индекс 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()", но Id любит переносить его по имени.

4b9b3361

Ответ 1

Мы можем использовать ix для изменения порядка, передав список:

In [27]:
# get a list of columns
cols = list(df)
# move the column to head of list using index, pop and insert
cols.insert(0, cols.pop(cols.index('Mid')))
cols
Out[27]:
['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
In [28]:
# use ix to reorder
df = df.ix[:, cols]
df
Out[28]:
                      Mid Net  Upper   Lower  Zsore
Answer_option                                      
More_than_once_a_day    2  0%  0.22%  -0.12%     65
Once_a_day              3  0%  0.32%  -0.19%     45
Several_times_a_week    4  2%  2.45%   1.10%     78
Once_a_week             6  1%  1.63%  -0.40%     65

Другой метод - взять ссылку на столбец и вставить его спереди:

In [39]:
mid = df['Mid']
df.drop(labels=['Mid'], axis=1,inplace = True)
df.insert(0, 'Mid', mid)
df
Out[39]:
                      Mid Net  Upper   Lower  Zsore
Answer_option                                      
More_than_once_a_day    2  0%  0.22%  -0.12%     65
Once_a_day              3  0%  0.32%  -0.19%     45
Several_times_a_week    4  2%  2.45%   1.10%     78
Once_a_week             6  1%  1.63%  -0.40%     65

Вы также можете использовать loc для достижения того же результата, что и ix будет устаревать в будущей версии pandas из 0.20.0 далее:

df = df.loc[:, cols]

Ответ 2

Вы можете использовать функцию df.reindex() в pandas. 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 = df.reindex(columns= cols)

out put: 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

Ответ 3

Мне не понравилось, как я должен был явно указать все остальные столбцы в других решениях, так что это сработало лучше для меня. Хотя это может быть медленно для больших фреймов данных...?

df = df.set_index('Mid').reset_index()

Ответ 4

Вот общий набор кода, который я часто использую, чтобы изменить расположение столбцов. Вы можете найти это полезным.

cols = df.columns.tolist()
n = int(cols.index('Mid'))
cols = [cols[n]] + cols[:n] + cols[n+1:]
df = df[cols]

Ответ 5

Может быть, я что-то упускаю, но многие из этих ответов кажутся слишком сложными. Вы должны иметь возможность просто установить столбцы в одном списке:

Колонка впереди:

df = df[ ['Mid'] + [ col for col in df.columns if col != 'Mid' ] ]

Или, если вместо этого, вы хотите переместить его обратно:

df = df[ [ col for col in df.columns if col != 'Mid' ] + ['Mid'] ]

Или, если вы хотите переместить более одного столбца:

cols_to_move = ['Mid', 'Zsore']
df           = df[ cols_to_move + [ col for col in df.columns if col not in cols_to_move ] ]

Ответ 6

Чтобы изменить порядок строк в кадре данных, просто используйте список следующим образом.

df = df[['Mid', 'Net', 'Upper', 'Lower', 'Zsore']]

Это делает очень очевидным, что было сделано при чтении кода позже. Также используйте:

df.columns
Out[1]: Index(['Net', 'Upper', 'Lower', 'Mid', 'Zsore'], dtype='object')

Затем нарежьте и вставьте, чтобы изменить порядок.

Ответ 7

Эта функция переупорядочивает ваши столбцы без потери данных. Все пропущенные столбцы остаются в центре набора данных:

def reorder_columns(columns, first_cols=[], last_cols=[], drop_cols=[]):
    columns = list(set(columns) - set(first_cols))
    columns = list(set(columns) - set(drop_cols))
    columns = list(set(columns) - set(last_cols))
    new_order = first_cols + columns + last_cols
    return new_order

Пример использования:

my_list = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']
reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])

# Output:
['fourth', 'third', 'first', 'sixth', 'second']

Чтобы назначить свой фрейм данных, используйте:

my_list = df.columns.tolist()
reordered_cols = reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])
df = df[reordered_cols]