Как изменить порядок столбцов DataFrame?


880

У меня есть следующее DataFrame( df):

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))

Я добавляю больше столбцов по заданию:

df['mean'] = df.mean(1)

Как я могу переместить столбец meanвперед, то есть установить его в качестве первого столбца, оставив порядок остальных столбцов без изменений?



1
Обобщенное решение на основе NumPy см. В разделе « Как переместить столбец в кадре данных pandas» , предполагает только один уровень столбца, т MultiIndex. Е. Нет .
JPP

После достаточного поиска я получил эту лучшую ссылку для колонок, переставляющих несколько логик в довольно простых терминах [колонки переставляют логику для панд] [ datasciencemadesimple.com/…
ravibeli

Ответы:


853

Одним простым способом было бы переназначить фрейм данных со списком столбцов, переставленных по мере необходимости.

Это то, что у вас есть сейчас:

In [6]: df
Out[6]:
          0         1         2         3         4      mean
0  0.445598  0.173835  0.343415  0.682252  0.582616  0.445543
1  0.881592  0.696942  0.702232  0.696724  0.373551  0.670208
2  0.662527  0.955193  0.131016  0.609548  0.804694  0.632596
3  0.260919  0.783467  0.593433  0.033426  0.512019  0.436653
4  0.131842  0.799367  0.182828  0.683330  0.019485  0.363371
5  0.498784  0.873495  0.383811  0.699289  0.480447  0.587165
6  0.388771  0.395757  0.745237  0.628406  0.784473  0.588529
7  0.147986  0.459451  0.310961  0.706435  0.100914  0.345149
8  0.394947  0.863494  0.585030  0.565944  0.356561  0.553195
9  0.689260  0.865243  0.136481  0.386582  0.730399  0.561593

In [7]: cols = df.columns.tolist()

In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']

Переставь colsтак, как хочешь. Вот как я переместил последний элемент на первую позицию:

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]

Затем измените порядок данных таким образом:

In [16]: df = df[cols]  #    OR    df = df.ix[:, cols]

In [17]: df
Out[17]:
       mean         0         1         2         3         4
0  0.445543  0.445598  0.173835  0.343415  0.682252  0.582616
1  0.670208  0.881592  0.696942  0.702232  0.696724  0.373551
2  0.632596  0.662527  0.955193  0.131016  0.609548  0.804694
3  0.436653  0.260919  0.783467  0.593433  0.033426  0.512019
4  0.363371  0.131842  0.799367  0.182828  0.683330  0.019485
5  0.587165  0.498784  0.873495  0.383811  0.699289  0.480447
6  0.588529  0.388771  0.395757  0.745237  0.628406  0.784473
7  0.345149  0.147986  0.459451  0.310961  0.706435  0.100914
8  0.553195  0.394947  0.863494  0.585030  0.565944  0.356561
9  0.561593  0.689260  0.865243  0.136481  0.386582  0.730399

17
если вы получаете «не можете объединить объекты str и list», убедитесь, что вы [] указали значение str в cols: cols = [cols [7]] + cols [: 7] + cols [8:]
moeabdol

3
@FooBar Это не объединение множеств, это объединение двух упорядоченных списков.
Аман

3
@ Аман, я просто указываю, что твой код устарел. Ваша обработка вашего сообщения на ваше усмотрение.
FooBar

2
@FooBar, тип colsявляется list; он даже допускает дубликаты (которые будут отбрасываться при использовании в кадре данных). Вы думаете об Indexобъектах.
Alexis

8
Это подразумевает копирование ВСЕХ данных, что крайне неэффективно. Я хотел, чтобы у панд был способ сделать это без создания копии.
Константин

442

Вы также можете сделать что-то вроде этого:

df = df[['mean', '0', '1', '2', '3']]

Вы можете получить список столбцов с:

cols = list(df.columns.values)

Выход будет производить:

['0', '1', '2', '3', 'mean']

... который затем легко переставить вручную, прежде чем поместить его в первую функцию


8
Вы также можете получить список столбцов со списком (df.columns)
Джим

8
илиdf.columns.tolist()
Джим

Для новичков, как я, реорганизуйте список, который вы получите от cols. Тогда df = df [cols], т.е. перестроенный список помещается в первое выражение без единого набора скобок.
Сид

Имена столбцов будут целыми числами в 3.x df = df[['mean1', 0, 1, 2, 3]]
prosti

1
Я не думаю, что это хороший ответ, так как он не предоставляет код, как изменить порядок столбцов любого фрейма данных. Скажем, я импортирую CSV-файл как pandas pd as pd.read_csv(). Как ваш ответ может быть использован для изменения порядка столбцов?
Робвх

312

Просто назначьте имена столбцов в том порядке, в котором вы хотите:

In [39]: df
Out[39]: 
          0         1         2         3         4  mean
0  0.172742  0.915661  0.043387  0.712833  0.190717     1
1  0.128186  0.424771  0.590779  0.771080  0.617472     1
2  0.125709  0.085894  0.989798  0.829491  0.155563     1
3  0.742578  0.104061  0.299708  0.616751  0.951802     1
4  0.721118  0.528156  0.421360  0.105886  0.322311     1
5  0.900878  0.082047  0.224656  0.195162  0.736652     1
6  0.897832  0.558108  0.318016  0.586563  0.507564     1
7  0.027178  0.375183  0.930248  0.921786  0.337060     1
8  0.763028  0.182905  0.931756  0.110675  0.423398     1
9  0.848996  0.310562  0.140873  0.304561  0.417808     1

In [40]: df = df[['mean', 4,3,2,1]]

Теперь «средняя» колонка выходит впереди:

In [41]: df
Out[41]: 
   mean         4         3         2         1
0     1  0.190717  0.712833  0.043387  0.915661
1     1  0.617472  0.771080  0.590779  0.424771
2     1  0.155563  0.829491  0.989798  0.085894
3     1  0.951802  0.616751  0.299708  0.104061
4     1  0.322311  0.105886  0.421360  0.528156
5     1  0.736652  0.195162  0.224656  0.082047
6     1  0.507564  0.586563  0.318016  0.558108
7     1  0.337060  0.921786  0.930248  0.375183
8     1  0.423398  0.110675  0.931756  0.182905
9     1  0.417808  0.304561  0.140873  0.310562

7
Это делает копию?
user3226167

21
@NicholasMorley - Это не лучший ответ, если у вас есть, скажем, 1000 столбцов в вашей df.
AGS

1
не похоже, что вы назначаете то, на <df>.columnsчто изначально претендуете
фанат Бьоркса номер один,

8
Это лучший ответ для небольшого количества столбцов.
Dongkyu Choi

2
Это просто копия более раннего ответа @freddygv. Это должен быть принятый ответ, а не этот.
Джеймс Хиршорн

134

35
Может ли это быть будущим дополнением pandas? что-то вроде df.move(0,df.mean)?
Джейсон

О, чувак, это даже работает так df_metadata.insert(0,'Db_name',"raw_data")(Код не относится к этой теме)
Aetos

3
Прекрасный. И это происходит на месте тоже.
cucu8

2
Это масштабируемое решение, поскольку другие решения вводят имена столбцов вручную.
CKM

Это работает для вопроса ОП при создании нового столбца, но не для перемещения столбца; попытка переместить результаты в*** ValueError: cannot insert mean, already exists
раскрутка

122

В твоем случае,

df = df.reindex(columns=['mean',0,1,2,3,4])

будет делать именно то, что вы хотите.

В моем случае (общая форма):

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))

2
Я попытался установить, copy=Falseно, похоже, reindex_axisвсе еще создает копию.
Константин

1
@Konstantin Вы можете создать еще один вопрос по этому вопросу? Было бы лучше иметь больше контекста
Альваро Жоао

57

Вам нужно создать новый список ваших столбцов в нужном порядке, а затем использовать df = df[cols]для перестановки столбцов в этом новом порядке.

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]

Вы также можете использовать более общий подход. В этом примере последний столбец (обозначенный -1) вставляется как первый столбец.

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]

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

inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df] 
        + [col for col in df if col not in inserted_cols])
df = df[cols]

47
import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names: 
    df[col] = np.random.randint(0,100, size=10000)

Вы можете попробовать следующие решения:

Решение 1:

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

Решение 2:


df = df[['mean', 'x', 'y', 'z']]

Решение 3:

col = df.pop("mean")
df = df.insert(0, col.name, col)

Решение 4:

df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)

Решение 5:

cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]

Решение 6:

order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]

Сравнение времени:

Решение 1:

Время ЦП: пользовательский 1,05 мс, sys: 35 мкс, общее время: 1,08 мс Время ожидания: 995 мкс

Решение 2 :

Время CPU: пользовательский 933 мкс, sys: 0 нс, всего: 933 мкс Время нахождения на стенке: 800 мкс

Решение 3 :

Время CPU: пользователь 0 нс, sys: 1,35 мс, всего: 1,35 мс Время настенного режима: 1,08 мс

Решение 4 :

Время процессора: пользовательский 1,23 мс, sys: 45 мкс, общее время: 1,27 мс Время ожидания: 986 мкс

Решение 5 :

Время ЦП: пользовательский 1,09 мс, sys: 19 мкс, общее время: 1,11 мс Время ожидания: 949 мкс

Решение 6 :

Время CPU: пользовательский 955 мкс, sys: 34 мкс, общее количество: 989 мкс Время нахождения на стенке: 859 мкс


1
Такой красивый ответ, спасибо.
qasimalbaqali

1
решение 1 - это то, что мне нужно, так как у меня слишком много столбцов (53), спасибо
ратнеш

@Pygirl, какое значение показывает реальное потребляемое время? (пользователь, sys, общее или настенное время)
sergzemsk

1
Это для меня лучший ответ на проблему. Так много решений (включая то, что мне было нужно) и простой подход. Спасибо!
Густаво Роттринг

1
Решение 6 (нет понимания списка):df = df.iloc[:, [1, 2, 3, 0]]
Дмитрий Работа

43

С августа 2018 года:

Если имена ваших столбцов слишком длинные для ввода, вы можете указать новый порядок через список целых чисел с позициями:

Данные:

          0         1         2         3         4      mean
0  0.397312  0.361846  0.719802  0.575223  0.449205  0.500678
1  0.287256  0.522337  0.992154  0.584221  0.042739  0.485741
2  0.884812  0.464172  0.149296  0.167698  0.793634  0.491923
3  0.656891  0.500179  0.046006  0.862769  0.651065  0.543382
4  0.673702  0.223489  0.438760  0.468954  0.308509  0.422683
5  0.764020  0.093050  0.100932  0.572475  0.416471  0.389390
6  0.259181  0.248186  0.626101  0.556980  0.559413  0.449972
7  0.400591  0.075461  0.096072  0.308755  0.157078  0.207592
8  0.639745  0.368987  0.340573  0.997547  0.011892  0.471749
9  0.050582  0.714160  0.168839  0.899230  0.359690  0.438500

Общий пример:

new_order = [3,2,1,4,5,0]
print(df[df.columns[new_order]])  

          3         2         1         4      mean         0
0  0.575223  0.719802  0.361846  0.449205  0.500678  0.397312
1  0.584221  0.992154  0.522337  0.042739  0.485741  0.287256
2  0.167698  0.149296  0.464172  0.793634  0.491923  0.884812
3  0.862769  0.046006  0.500179  0.651065  0.543382  0.656891
4  0.468954  0.438760  0.223489  0.308509  0.422683  0.673702
5  0.572475  0.100932  0.093050  0.416471  0.389390  0.764020
6  0.556980  0.626101  0.248186  0.559413  0.449972  0.259181
7  0.308755  0.096072  0.075461  0.157078  0.207592  0.400591
8  0.997547  0.340573  0.368987  0.011892  0.471749  0.639745
9  0.899230  0.168839  0.714160  0.359690  0.438500  0.050582

А для конкретного случая вопроса ОП:

new_order = [-1,0,1,2,3,4]
df = df[df.columns[new_order]]
print(df)

       mean         0         1         2         3         4
0  0.500678  0.397312  0.361846  0.719802  0.575223  0.449205
1  0.485741  0.287256  0.522337  0.992154  0.584221  0.042739
2  0.491923  0.884812  0.464172  0.149296  0.167698  0.793634
3  0.543382  0.656891  0.500179  0.046006  0.862769  0.651065
4  0.422683  0.673702  0.223489  0.438760  0.468954  0.308509
5  0.389390  0.764020  0.093050  0.100932  0.572475  0.416471
6  0.449972  0.259181  0.248186  0.626101  0.556980  0.559413
7  0.207592  0.400591  0.075461  0.096072  0.308755  0.157078
8  0.471749  0.639745  0.368987  0.340573  0.997547  0.011892
9  0.438500  0.050582  0.714160  0.168839  0.899230  0.359690

Основная проблема этого подхода заключается в том, что многократный вызов одного и того же кода каждый раз будет приводить к разным результатам, поэтому нужно быть осторожным :)


17

Эта функция избавляет вас от необходимости перечислять каждую переменную в наборе данных, чтобы упорядочить несколько из них.

def order(frame,var):
    if type(var) is str:
        var = [var] #let the command take a string or list
    varlist =[w for w in frame.columns if w not in var]
    frame = frame[var+varlist]
    return frame 

Он принимает два аргумента: первый - это набор данных, второй - столбцы в наборе данных, которые вы хотите вывести на передний план.

Так что в моем случае у меня есть набор данных с именем Frame с переменными A1, A2, B1, B2, Total и Date. Если я хочу вывести Total на фронт, все, что мне нужно сделать, это:

frame = order(frame,['Total'])

Если я хочу вывести Total и Date на первый план, тогда я делаю:

frame = order(frame,['Total','Date'])

РЕДАКТИРОВАТЬ:

Еще один полезный способ использовать это, если у вас есть незнакомая таблица и вы ищете переменные с определенным термином в них, например, VAR1, VAR2, ... вы можете выполнить что-то вроде:

frame = order(frame,[v for v in frame.columns if "VAR" in v])

17

Я сам столкнулся с похожим вопросом и просто хотел добавить то, на чем остановился. Мне понравилось reindex_axis() methodдля изменения порядка столбцов. Это сработало:

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

Альтернативный метод, основанный на комментарии @Jorge:

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

Хотя reindex_axisкажется, что он немного быстрее в тестах микро, чем reindex, я думаю, я предпочитаю последний из-за его прямоты.


6
Это было хорошее решение, но reindex_axis будет устаревшим. Я использовал Reindex, и он работал просто отлично.
Хорхе

15

Просто сделай,

df = df[['mean'] + df.columns[:-1].tolist()]

TypeError: Невозможно неявно преобразовать объект 'int' в str
parvij

может быть API изменился, вы также можете сделать это ... order = df.columns.tolist() df['mean'] = df.mean(1) df.columns = ['mean'] + order
Napitupulu Jon

1
Вариант этого работал хорошо для меня. С существующим списком, headersкоторый использовался для создания dict, который затем использовался для создания DataFrame, я вызвал df.reindex(columns=headers). Единственной проблемой, с которой я столкнулся, было то, что я уже позвонил df.set_index('some header name', inplace=True), поэтому, когда переиндексация была выполнена, он добавил еще один столбец с именем, some header nameпоскольку исходный столбец теперь был индексом. Что касается синтаксиса, указанного выше, то ['mean'] + df.columnsв интерпретаторе python мне даетсяIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
hlongmore

1
@hlongmore: я не знаю, какой у вас предыдущий код, но редактирование должно работать (с использованием 0.19.2)
Напитупулу Джон

Редактирование действительно работает (я на 0.20.2). В моем случае у меня уже есть нужные столбцы, поэтому я думаю, что df.reindex () - это то, что мне действительно следует использовать.
Хлонгмор

11

Вы могли бы сделать следующее (заимствуя части из ответа Амана):

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]

10

Просто введите имя столбца, который вы хотите изменить, и установите индекс для нового местоположения.

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]

Для вашего случая это будет выглядеть так:

df = change_column_order(df, 'mean', 0)

Это недооценено
zelusp

8

Перемещение любого столбца в любую позицию:

import pandas as pd
df = pd.DataFrame({"A": [1,2,3], 
                   "B": [2,4,8], 
                   "C": [5,5,5]})

cols = df.columns.tolist()
column_to_move = "C"
new_position = 1

cols.insert(new_position, cols.pop(cols.index(column_to_move)))
df = df[cols]

7

Я думаю, что это немного более аккуратное решение:

df.insert(0,'mean', df.pop("mean"))

Это решение несколько похоже на решение @JoeHeffer, но это один лайнер.

Здесь мы удаляем столбец "mean"из кадра данных и присоединяем его к индексу 0с тем же именем столбца.


5

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

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)

5

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

df.reindex(sorted(df.columns), axis=1)

19
Нет, это другое. Там пользователь хочет отсортировать все столбцы по имени. Здесь они хотят переместить один столбец к первому столбцу, оставив порядок остальных столбцов без изменений.
smci

1
Что делать, если вы не хотите, чтобы они отсортированы?
Chankey Pathak

это возвращает копию, не работает на месте
раскрутка

3

Как насчет использования "T"?

df.T.reindex(['mean',0,1,2,3,4]).T

3

@clocker: Ваше решение было очень полезным для меня, так как я хотел вывести два столбца вперед из кадра данных, где я не знаю точно имена всех столбцов, потому что они были сгенерированы ранее из сводной инструкции. Итак, если вы находитесь в той же ситуации: чтобы вывести перед собой столбцы, имена которых вы знаете, а затем позволить им следовать «все остальные столбцы», я пришел к следующему общему решению;

df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)

3

set():

Используется простой подход set(), в частности, когда у вас длинный список столбцов и вы не хотите обрабатывать их вручную:

cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]

2
Одно предостережение: порядок столбцов исчезнет, ​​если вы поместите его в набор
pvarma

Интересно! @ user1930402 Я несколько раз пробовал подход, описанный выше, и у меня никогда не было проблем. Я еще раз проверю.
Шореш

2

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

Я получил это, чтобы работать, хотя с помощью IndexedSet из пакета boltons.

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

from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]

Надеюсь, что это полезно для всех, кто ищет в этой теме общее решение.


Я немного удивлен! Я использую setдля этого довольно часто и никогда не приходилось иметь дело с заказом.
шореш

2

Вы можете использовать, reindexкоторый может быть использован для обеих осей:

df
#           0         1         2         3         4      mean
# 0  0.943825  0.202490  0.071908  0.452985  0.678397  0.469921
# 1  0.745569  0.103029  0.268984  0.663710  0.037813  0.363821
# 2  0.693016  0.621525  0.031589  0.956703  0.118434  0.484254
# 3  0.284922  0.527293  0.791596  0.243768  0.629102  0.495336
# 4  0.354870  0.113014  0.326395  0.656415  0.172445  0.324628
# 5  0.815584  0.532382  0.195437  0.829670  0.019001  0.478415
# 6  0.944587  0.068690  0.811771  0.006846  0.698785  0.506136
# 7  0.595077  0.437571  0.023520  0.772187  0.862554  0.538182
# 8  0.700771  0.413958  0.097996  0.355228  0.656919  0.444974
# 9  0.263138  0.906283  0.121386  0.624336  0.859904  0.555009

df.reindex(['mean', *range(5)], axis=1)

#        mean         0         1         2         3         4
# 0  0.469921  0.943825  0.202490  0.071908  0.452985  0.678397
# 1  0.363821  0.745569  0.103029  0.268984  0.663710  0.037813
# 2  0.484254  0.693016  0.621525  0.031589  0.956703  0.118434
# 3  0.495336  0.284922  0.527293  0.791596  0.243768  0.629102
# 4  0.324628  0.354870  0.113014  0.326395  0.656415  0.172445
# 5  0.478415  0.815584  0.532382  0.195437  0.829670  0.019001
# 6  0.506136  0.944587  0.068690  0.811771  0.006846  0.698785
# 7  0.538182  0.595077  0.437571  0.023520  0.772187  0.862554
# 8  0.444974  0.700771  0.413958  0.097996  0.355228  0.656919
# 9  0.555009  0.263138  0.906283  0.121386  0.624336  0.859904

2

Вот функция, чтобы сделать это для любого количества столбцов.

def mean_first(df):
    ncols = df.shape[1]        # Get the number of columns
    index = list(range(ncols)) # Create an index to reorder the columns
    index.insert(0,ncols)      # This puts the last column at the front
    return(df.assign(mean=df.mean(1)).iloc[:,index]) # new df with last column (mean) first

2

Самый хакерский метод в книге

df.insert(0,"test",df["mean"])
df=df.drop(columns=["mean"]).rename(columns={"test":"mean"})

2

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

def reorder_df_columns(df, start=None, end=None):
    """
        This function reorder columns of a DataFrame.
        It takes columns given in the list `start` and move them to the left.
        Its also takes columns in `end` and move them to the right.
    """
    if start is None:
        start = []
    if end is None:
        end = []
    assert isinstance(start, list) and isinstance(end, list)
    cols = list(df.columns)
    for c in start:
        if c not in cols:
            start.remove(c)
    for c in end:
        if c not in cols or c in start:
            end.remove(c)
    for c in start + end:
        cols.remove(c)
    cols = start + cols + end
    return df[cols]

1

Я считаю, что ответ @ Aman является лучшим, если вы знаете местоположение другой колонки.

Если вы не знаете, где находится mean, но имеете только его название, вы не можете прибегнуть непосредственно к нему cols = cols[-1:] + cols[:-1]. Следующее - лучшая вещь, которую я мог придумать:

meanDf = pd.DataFrame(df.pop('mean'))
# now df doesn't contain "mean" anymore. Order of join will move it to left or right:
meanDf.join(df) # has mean as first column
df.join(meanDf) # has mean as last column

1

Просто листать помогает часто.

df[df.columns[::-1]]

Или просто перемешать для взгляда.

import random
cols = list(df.columns)
random.shuffle(cols)
df[cols]

1

Довольно простое решение, которое сработало для меня, - это использовать .reindex для df.columns:

df=df[df.columns.reindex(['mean',0,1,2,3,4])[0]]

1

Самый простой способ Предположим, у вас есть dfс колонками A B C, вы можете простоdf.reindex(['B','C','A'],axis=1)


0

Большинство ответов недостаточно обобщены, и метод pandas reindex_axis немного утомителен, поэтому я предлагаю простую функцию для перемещения произвольного числа столбцов в любую позицию, используя словарь, в котором ключ = имя столбца и значение = позиция для перемещения. Если ваш фрейм данных имеет большой размер, передайте True в 'big_data', тогда функция вернет список упорядоченных столбцов. И вы можете использовать этот список, чтобы нарезать свои данные.

def order_column(df, columns, big_data = False):

    """Re-Orders dataFrame column(s)
       Parameters : 
       df      -- dataframe
       columns -- a dictionary:
                  key   = current column position/index or column name
                  value = position to move it to  
       big_data -- boolean 
                  True = returns only the ordered columns as a list
                          the user user can then slice the data using this
                          ordered column
                  False = default - return a copy of the dataframe
    """
    ordered_col = df.columns.tolist()

    for key, value in columns.items():

        ordered_col.remove(key)
        ordered_col.insert(value, key)

    if big_data:

        return ordered_col

    return df[ordered_col]

# e.g.
df = pd.DataFrame({'chicken wings': np.random.rand(10, 1).flatten(), 'taco': np.random.rand(10,1).flatten(),
                          'coffee': np.random.rand(10, 1).flatten()})
df['mean'] = df.mean(1)

df = order_column(df, {'mean': 0, 'coffee':1 })

>>>

вывод

col = order_column(df, {'mean': 0, 'coffee':1 }, True)

col
>>>
['mean', 'coffee', 'chicken wings', 'taco']

# you could grab it by doing this

df = df[col]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.