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)
Для нескольких столбцов, вы можете разместить столбцы в порядке, что вы хотите:
#['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 - имя столбца, если вы хотите отсортировать набор данных по столбцу