Установить порядок столбцов в кадре данных pandas

107

Есть ли способ изменить порядок столбцов в фрейме данных pandas на основе моих личных предпочтений (то есть не в алфавитном или числовом порядке, а, скорее, в соответствии с определенными соглашениями)?

Простой пример:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

производит это:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

Но вместо этого я бы хотел это:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(Пожалуйста, предоставьте общее решение, а не конкретное для этого случая. Большое спасибо.)

дурбахит
источник

Ответы:

162

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

frame = frame[['column I want first', 'column I want second'...etc.]]
А.Кот
источник
28
Это работает только с этим довольно небольшим примером. Если вы читаете данные из другого источника, такого как файл csv или таблица базы данных, вы не можете использовать этот ответ. И такие, кажется, встречаются гораздо чаще. OP запросил общее решение.
chrisfs 07
85

Вы можете использовать это:

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)
Окрошиашвили
источник
6
Несмотря на то, что большинство других решений более лаконичны, я считаю это наиболее читаемым для всех, кто не знаком с ним на 100% pandas.
Дирк
3
Не забудьте присвоить возвращаемое значение переменной, это не pandasменяет порядок столбцов на месте (по крайней мере, не в v0.23`).
Дирк
Спасибо @Dirk за предложение
Окрошиашвили
34

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

Что вы можете и, скорее всего, захотите сделать, так это просто заказать первые несколько столбцов, которые вы часто используете, и позволить всем остальным столбцам быть самими собой. Это общий подход в R.df %>%select(one, two, three, everything())

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

Затем вы составляете список для новых столбцов, объединив остальные столбцы:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

После этого вы можете использовать new_columnsдругие предлагаемые решения.

import pandas as pd
frame = pd.DataFrame({
    'one thing': [1, 2, 3, 4],
    'other thing': ['a', 'e', 'i', 'o'],
    'more things': ['a', 'e', 'i', 'o'],
    'second thing': [0.1, 0.2, 1, 2],
})

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

   one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o
Лала Ла
источник
1
блестящий, идеальный. спасибо за то, что
избавили
Это общий ответ, и он должен быть принятым ответом
CarlosH
26

Вы также можете сделать что-нибудь вроде df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

Также вы можете получить список столбцов с помощью:

cols = list(df.columns.values)

Результат будет примерно таким:

['x', 'y', 'a', 'b']

Которую потом легко переставить вручную.

omri_saadon
источник
13

Создайте его со списком вместо словаря

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o
PiRSquared
источник
Я не мог получить «имя столбца»: данные для работы внутри списка, как в dict.
Ким Миллер
10

Вы также можете использовать OrderedDict:

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o
MaxU
источник
6

Добавьте параметр columns:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']},
        columns=['one thing', 'second thing', 'other thing']
)
Ирена
источник
4

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

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

Сейчас:

print(frame)

Является:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o
U10-Нападающий
источник
-2

Я считаю, что это самый простой и рабочий вариант:

df = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

df = df[['one thing','second thing', 'other thing']]
Sando K
источник