Python Pandas - переупорядочение столбцов в кадре данных на основе имени столбца

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

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

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

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

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

12 ответов

Решение
df.reindex_axis(sorted(df.columns), axis=1)

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

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

df.sort_index(axis=1)

Редактировать:

Убедитесь, что вы держите значение

df = df.sort_index(axis=1)

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

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

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

DF [сортирован (df.columns)]

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

#['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

Затем сделайте:

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

В результате чего:

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

Ответ Tweet может быть передан на ответ 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

Затем сделайте:

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

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

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

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

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

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

Самый быстрый метод:

df.sort_index(axis=1)

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

sortedDf=df.sort_index(axis=1)

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

Например, вы можете начать все свои функции с 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)   ], [])  ]

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

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

Вы также можете использовать устаревшие sort:

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

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

Другие вопросы по тегам