16

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

14

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

import numpy as np
import pandas as pd

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

Я добавил новый столбец с именем mean следующим образом:

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

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

5 ответ(ов)

14

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

Вот как выглядит ваш DataFrame сейчас:

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]

Теперь можно перестроить DataFrame в новом порядке столбцов:

In [16]: df = df[cols]  #    ИЛИ    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

Теперь столбец 'mean' находится на первом месте в DataFrame.

8

Вы можете сделать что-то подобное:

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

Чтобы получить список столбцов, вы можете использовать:

cols = list(df.columns.values)

Вывод будет следующим:

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

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

4

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

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

Теперь столбец 'mean' будет отображаться первым. Пример результата:

   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

Таким образом, вы можете легко изменить порядок столбцов в DataFrame в соответствии с вашими потребностями.

3

Для Pandas >= 1.3 (ответ обновлён в 2022):

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

Что касается версии Pandas < 1.3 (оригинальный ответ):

df.insert(0, 'mean', df['mean'])

Обратите внимание, что в новой версии вы можете использовать pop, чтобы переместить столбец, что удобнее, так как это удаляет столбец из исходного DataFrame и возвращает его значение. В старой версии вам нужно было просто вставить значение столбца, но это не удалит его из DataFrame. Для получения дополнительной информации о работе со столбцами в Pandas, вы можете ознакомиться с документацией.

2

В вашем случае:

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'])))

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь