Изменение порядка столбцов в кадре данных pandas на основе имени столбца

У меня есть dataframe с более чем 200 столбцами. Вопрос в том, как они были созданы, порядок

['Q1.3','Q6.1','Q1.2','Q1.1',......]

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

['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]

Есть ли способ для меня сделать это в Python?

Ответ 1

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

Это предполагает, что сортировка имен столбцов даст желаемый порядок. Если имена ваших столбцов не будут сортироваться лексикографически (например, если вы хотите, чтобы столбец Q10.3 появлялся после Q9.1), вам придется сортировать по-другому, но это не имеет ничего общего с пандами.

Ответ 2

Вы также можете сделать более кратко:

df.sort_index(axis=1)

Убедитесь, что вы присвоили результат обратно:

df = df.sort_index(axis=1)

Или сделайте это на месте:

df.sort_index(axis=1, inplace=True)

Ответ 3

Вы можете просто сделать:

df[sorted(df.columns)]

Изменение: короче

df[sorted(df)]

Ответ 4

Tweet answer можно передать в ответ BrenBarn выше с помощью

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

Итак, для вашего примера скажем:

vals = randint(low=16, high=80, size=25).reshape(5,5)
cols = ['Q1.3', 'Q6.1', 'Q1.2', 'Q9.1', 'Q10.2']
data = DataFrame(vals, columns = cols)

Вы получаете:

data

    Q1.3    Q6.1    Q1.2    Q9.1    Q10.2
0   73      29      63      51      72
1   61      29      32      68      57
2   36      49      76      18      37
3   63      61      51      30      31
4   36      66      71      24      77

Тогда do:

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

в результате:

data


     Q1.2    Q1.3    Q6.1    Q9.1    Q10.2
0    2       0       1       3       4
1    7       5       6       8       9
2    2       0       1       3       4
3    2       0       1       3       4
4    2       0       1       3       4

Ответ 5

Не забудьте добавить "inplace = True" в ответ Wes или установить результат в новый DataFrame.

df.sort_index(axis=1, inplace=True)

Ответ 6

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

sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)

Я тестировал это в 2.7.10, и это сработало для меня.

Ответ 7

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

#['A', 'B', 'C'] <-this is your columns order
df = df[['C', 'B', 'A']]

В этом примере показаны столбцы сортировки и разрезания:

d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]}
df = pandas.DataFrame(d)

Вы получаете:

col1  col2  col3  col4
 1     4     7    17
 2     5     8    18
 3     6     9    19

Тогда do:

df = df[['col3', 'col2', 'col1']]

Результат:

col3  col2  col1
7     4     1
8     5     2
9     6     3     

Ответ 8

Самый быстрый способ:

df.sort_index(axis=1)

Имейте в виду, что это создает новый экземпляр. Поэтому вам нужно сохранить результат в новой переменной:

sortedDf=df.sort_index(axis=1)

Ответ 9

Метод sort и sorted позволяют вам предоставить настраиваемую функцию для извлечения ключа, используемого для сравнения:

>>> ls = ['Q1.3', 'Q6.1', 'Q1.2']
>>> sorted(ls, key=lambda x: float(x[1:]))
['Q1.2', 'Q1.3', 'Q6.1']

Ответ 10

Один из вариантов использования - это то, что вы назвали (некоторые из) ваши столбцы с некоторым префиксом, и хотите, чтобы столбцы были отсортированы с этими префиксами вместе и в определенном порядке (а не в алфавитном порядке).

Например, вы можете запустить все свои функции с помощью Ft_, наклейки с Lbl_ и т.д., и сначала вы хотите, чтобы все незафиксированные столбцы, а затем все функции, а затем метка. Вы можете сделать это со следующей функцией (я буду замечать возможную проблему с эффективностью, используя sum для сокращения списков, но это не проблема, если у вас нет много столбцов, что у меня нет):

def sortedcols(df, groups = ['Ft_', 'Lbl_'] ):
    return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: ['^(?!(%s))' % '|'.join(l)] + ['^%s' % i  for i in l ] )(groups)   ], [])  ]

Ответ 11

print df.sort_index(by='Frequency',ascending=False)

где by - имя столбца, если вы хотите отсортировать набор данных на основе столбца