it-swarm.com.ru

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

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

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

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

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

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

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

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

240
BrenBarn

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

df.sort_index(axis=1)

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

df = df.sort_index(axis=1)

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

df.sort_index(axis=1, inplace=True)
252
Wes McKinney

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

 Df [отсортированные (df.columns)] 

Правка: короче 

df[sorted(df)]
23
Ivelin

ответ 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
17
Jeremy Low

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

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

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

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

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

12
M.Z

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

#['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     
9
Myeongsik Joo

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

df.sort_index(axis=1)

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

sortedDf=df.sort_index(axis=1)
3
multigoodverse

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

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

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

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