pandas pivot_table настроить порядок столбцов [дубликат]

Я бы использовал следующие настройки:

  1. Cache-Control: max-age = 31556926 - Представления могут кэшироваться любым кешем. Кэшированное представление должно считаться свежим в течение 1 года. Чтобы пометить ответ как «никогда не истекает», сервер происхождения отправляет дату Expires примерно один год с момента отправки ответа. Серверы HTTP / 1.1 НЕ ДОЛЖНЫ отправлять . Истекает даты более одного года в будущем.
  2. Cache-Control: no-cache - представления могут кэшироваться любым кешем. Но кеши должны отправить запрос серверу происхождения для проверки перед выпуском кешированной копии.
  3. Cache-Control: no-store - Кэши не должны кэшировать представление при любых условиях.

Для получения дополнительной информации см. учебное пособие по методу Марк Ноттингема .

479
задан dmvianna 4 January 2013 в 08:09
поделиться

26 ответов

Вам нужно создать новый список столбцов в нужном порядке, а затем использовать 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]
20
ответ дан Alexander 15 August 2018 в 21:50
поделиться

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

df = df.reindex_axis(['mean',0,1,2,3,4], axis=1)

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

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

df = df.reindex_axis(sorted(df.columns), axis=1)
df = df.reindex_axis(['opened'] + list([a for a in df.columns if a != 'opened']), axis=1)

update Jan 2018

Если вы хотите использовать reindex:

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))
42
ответ дан Alvaro Joao 15 August 2018 в 21:50
поделиться
  • 1
    Я попытался установить copy=False, но похоже, что reindex_axis все еще создает копию. – Konstantin 27 November 2017 в 10:10
  • 2
    @Konstantin вы можете создать еще один вопрос об этой проблеме? Было бы лучше иметь больше контекста – Alvaro Joao 27 November 2017 в 15:11
  • 3
    Поскольку reindex_axis устарел, вместо этого используйте reindex – DucCuong 28 December 2017 в 15:26

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

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

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
506
ответ дан Aman 15 August 2018 в 21:50
поделиться
  • 1
    incase вы получаете & quot; не может конкатенировать объекты 'str' и 'list' & quot; убедитесь, что вы [] значение str в cols: cols = [cols [7]] + cols [: 7] + cols [8:] – moeabdol 9 January 2015 в 17:59
  • 2
    @FooBar Это не объединенный набор, это объединение двух упорядоченных списков. – Aman 6 October 2016 в 22:08
  • 3
    @Aman Я просто указываю, что ваш код устарел. Ваша обработка вашего сообщения по вашему усмотрению. – FooBar 7 October 2016 в 06:13
  • 4
    @FooBar, тип cols - list; он даже допускает дубликаты (которые будут отбрасываться при использовании в кадре данных). Вы думаете об объектах Index. – alexis 28 February 2017 в 16:19
  • 5
    Это подразумевает копирование ВСЕХ данных, что крайне неэффективно. Я хотел, чтобы у панд был способ сделать это, не создавая копию. – Konstantin 27 November 2017 в 09:48

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

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)
5
ответ дан ccerhan 15 August 2018 в 21:50
поделиться
  • 1
    большое общее и эффективное решение, спасибо! – Dennis Golomazov 6 January 2018 в 00:26

Я столкнулся с подобным вопросом и просто хотел добавить то, на что я остановился. Мне понравился 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 , Я думаю, что я предпочитаю последнее за его прямоту.

8
ответ дан clocker 15 August 2018 в 21:50
поделиться
  • 1
    Это было приятное решение, но reindex_axis будет устаревшим. Я использовал reindex, и он работал отлично. – Jorge 8 August 2018 в 21:32

Я верю @ Ответ Амана является лучшим, если вы знаете расположение другого столбца.

Если вы не знаете местоположение 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
3
ответ дан Community 15 August 2018 в 21:50
поделиться
  • 1
    Нет, это другое. Там пользователь хочет отсортировать все столбцы по имени. Здесь они хотят переместить один столбец в первый столбец, оставив порядок остальных столбцов нетронутым. – smci 17 April 2013 в 14:06
  • 2
    Что делать, если вы не хотите, чтобы они отсортировались? – Chankey Pathak 8 June 2017 в 10:16

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

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
165
ответ дан fixxxer 15 August 2018 в 21:50
поделиться
  • 1
    Это должен быть принятый ответ. – Nicholas Morley 13 April 2017 в 12:09
  • 2
    Он делает копию? – user3226167 2 June 2017 в 02:02
  • 3
    @NicholasMorley - Это не лучший ответ, если у вас есть, скажем, 1000 столбцов в вашем df. – AGS 21 July 2017 в 20:19
  • 4
    это не похоже на то, что вы назначаете <df>.columns, как вы утверждаете, изначально – Mike Palmice 19 February 2018 в 20:09
  • 5
    Это лучший ответ для небольшого количества столбцов. – Dongkyu Choi 19 April 2018 в 23:12

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

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

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

cols = list(df.columns.values)

На выходе будут появляться:

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

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

193
ответ дан freddygv 15 August 2018 в 21:50
поделиться
  • 1
    Вы также можете получить список столбцов со списком (df.columns) – Jim 9 October 2015 в 22:14
  • 2
    или df.columns.tolist() – Jim 9 October 2015 в 22:22
  • 3
    Три года спустя этот вопрос по-прежнему возникает в первую очередь на google, и ответ freddygv должен быть принят как правильный. – rioted 2 March 2018 в 19:25
  • 4
    Для новичков, подобных мне, переустановите список, который вы получите из cols. Затем df = df [cols], то есть переупорядоченный список попадает в первое выражение без одного набора скобок. – Sid 20 March 2018 в 16:18
  • 5
    – Khalil Al Hooti 31 August 2018 в 21:04

Здесь вы можете сделать это для любого количества столбцов.

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
ответ дан freeB 15 August 2018 в 21:50
поделиться

Самый простой способ - изменить порядок имен столбцов, таких как

df = df[['mean', Col1,Col2,Col3]]

4
ответ дан Gayatri 15 August 2018 в 21:50
поделиться

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

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

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

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

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

1
ответ дан Jamelade 15 August 2018 в 21:50
поделиться

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

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)
2
ответ дан Joe Heffer 15 August 2018 в 21:50
поделиться

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

df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)
2
ответ дан matthhias 15 August 2018 в 21:50
поделиться

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

df = df[['mean'] + df.columns[:-1].tolist()]
12
ответ дан Napitupulu Jon 15 August 2018 в 21:50
поделиться
  • 1
    TypeError: Невозможно преобразовать объект 'int' в str неявно – parvij 5 January 2016 в 12:10
  • 2
    может быть изменен API, вы также можете это сделать ... order = df.columns.tolist() df['mean'] = df.mean(1) df.columns = ['mean'] + order – Napitupulu Jon 8 January 2016 в 11:28
  • 3
    Вариант этого хорошо сработал для меня. В существующем списке 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 20 June 2017 в 19:41
  • 4
    @hlongmore: я не знаю, что ваш предыдущий код есть, но редактирование должно работать (используя 0.19.2) – Napitupulu Jon 21 June 2017 в 00:56
  • 5
    Редактирование действительно работает (я на 0.20.2). В моем случае у меня уже есть нужные столбцы, поэтому я думаю, что df.reindex () - это то, что я действительно должен использовать. – hlongmore 22 June 2017 в 17:49

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

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

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

df = df[cols]
6
ответ дан otteheng 15 August 2018 в 21:50
поделиться

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

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]
4
ответ дан pomber 15 August 2018 в 21:50
поделиться

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

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

EDIT:

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

frame = order(frame,[v for v in frame.columns if "VAR" in v])
12
ответ дан seeiespi 15 August 2018 в 21:50
поделиться

DataFrame.sort_index(axis=1) довольно чист. Проверьте документ здесь . А затем concat

1
ответ дан Shihe Zhang 15 August 2018 в 21:50
поделиться

set():

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

cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]
3
ответ дан Shoresh 15 August 2018 в 21:50
поделиться
  • 1
    Одно предостережение: порядок столбцов уходит, если вы положите его в набор – user1930402 6 March 2018 в 06:31
  • 2
    Интересно! @ user1930402 Я несколько раз пробовал описанный выше подход и никогда не испытывал никаких проблем. Я снова проверю дважды. – Shoresh 6 March 2018 в 15:50

Вы можете использовать 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
ответ дан silgon 15 August 2018 в 21:50
поделиться

Я попробовал функцию insert(), предложенную Уэсом МакКинни.

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

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

3
ответ дан Simon 15 August 2018 в 21:50
поделиться
78
ответ дан Wes McKinney 15 August 2018 в 21:50
поделиться
  • 1
    Может ли это быть будущей функцией добавить к pandas? что-то вроде df.move(0,df.mean)? – jason 27 May 2014 в 02:23
  • 2
    О, человек, он работает так же df_metadata.insert(0,'Db_name',"raw_data") (код не относится к этой теме) – Aetos 12 June 2018 в 09:10
  • 3
    Красивый. И это происходит и на месте. – cucu8 2 August 2018 в 10:29

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

df.T.reindex(['mean',0,1,2,3,4]).T
3
ответ дан ZEE 15 August 2018 в 21:50
поделиться
3
ответ дан Community 5 September 2018 в 21:33
поделиться
2
ответ дан Yuca 5 September 2018 в 21:33
поделиться
0
ответ дан U9-Forward 29 October 2018 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: