У меня есть фрейм данных, а не последовательности. если я использую len(df.columns)
, мои данные имеют 3586 столбцов. Как изменить порядок последовательностей данных?
ID V1 V10 V100 V1000 V1001 V1002 ... V990 V991 V992 V993 V994
A 1 9.0 2.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
B 1 1.2 0.1 3.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
C 2 8.6 8.0 2.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0
D 3 0.0 2.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 0.0
E 4 7.8 6.6 3.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 0.0
Я использовал это df = df.reindex(sorted(df.columns), axis=1)
(на основе этого вопроса Изменение порядка столбцов в фрейме данных pandas на основе имени столбца), но все еще не работает.
Спасибо
это в ответе на то, что вы разместили, и sorted(df.columns)
будет сортировать список на основе строки, а не на основе int
, потому что у вас есть V
@Nihal - у меня ошибка could not convert string to float: 'ac'
что такое ac
?? в вашем фрейме данных? не могли бы вы опубликовать вывод print(list(df.columns))
@Nihal - я использовал print(list(df.columns))
, и результатом является идентификатор и все буквы «V» с номером, но не с последовательностью. Я не знаю, откуда берется ac
@Arief - отредактированный ответ, он должен работать и со столбцами ac
.
Сначала получите все столбцы без шаблона V
+ number
путем фильтрации с помощью str.contains
, затем отсортируйте все остальные значения с помощью Index.difference
, сложите вместе и перейдите к DataFrame.reindex
— сначала получите все нечисловые несовпадающие столбцы в первых позициях, а затем отсортируйте столбцы V
+ number
:
L1 = df.columns[~df.columns.str.contains('^V\d+$')].tolist()
L2 = sorted(df.columns.difference(L1), key=lambda x: float(x[1:]))
df = df.reindex(L1 + L2, axis=1)
print (df)
ID V1 V10 V100 V990 V991 V992 V993 V994 V1000 V1001 V1002
A 1 9.0 2.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
B 1 1.2 0.1 3.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
C 2 8.6 8.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
D 3 0.0 2.0 0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
E 4 7.8 6.6 3.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
использовать
data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)