Встановіть порядок стовпців у фреймі даних панд


103

Чи існує спосіб упорядкування стовпців у фреймі даних панд на основі моїх особистих уподобань (тобто не в алфавітному чи цифровому порядку, але більше схожим на певні умови)?

Простий приклад:

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

(Будь ласка, надайте загальне рішення, а не конкретне для цієї справи. Дякую.)

Відповіді:


156

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

frame = frame[['column I want first', 'column I want second'...etc.]]

24
Це працює лише з цим досить малим прикладом. Якщо ви читаєте дані з іншого джерела, наприклад, файл csv або таблиця бази даних, ви не можете використовувати цю відповідь. І це, здається, набагато частіше. ОП вимагала загального рішення.
хрестики

83

Ви можете скористатися цим:

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

frame = frame.reindex(columns=columnsTitles)

5
Хоча більшість інших рішень є більш стислими, я вважаю це найбільш читабельним для тих, хто не знає на 100% pandas.
Дірк

3
Не забудьте призначити повернене значення змінній, однак це не змінює порядок стовпців на місці (принаймні, не в pandasv0.23`).
Дірк

Дякую @Dirk за пропозицію
Окрошіашвілі

33

Ось таке рішення я використовую дуже часто. Якщо у вас великий набір даних із тоннами стовпців, ви точно не хочете вручну переставляти всі стовпці.

Що ви можете, і, швидше за все, хочете зробити, це просто замовити перші кілька стовпців, якими ви часто користуєтесь, і дозволити всім іншим стовпцям бути самими собою. Це загальний підхід у Р.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
блискучий, досконалий. дякую за те, що мені не
stuart

Це загальна відповідь і має бути прийнятою відповіддю
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']

Потім легко переставити вручну.


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

Я не міг отримати "ім'я стовпця": дані для роботи всередині списку, як це відбувається в диктаті.
Кім Міллер

10

Ви також можете використовувати OrdersDict:

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

6

Додайте параметр "стовпці":

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

-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']]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.