У меня есть DataFrame, у которого есть столбец под названием "Financial Week Name", у которого есть что-то вроде "недели 17" на каждую финансовую неделю.
Financial Week Name Day Part
week 0 Breakfast
week 0 Lunch
week 0 Dinner
week 1 Breakfast
week 1 Lunch
Проблема в том, что я не могу сортировать их от самых маленьких до самых больших. Моя мысль заключалась в том, чтобы взломать что-либо после пробела после слова "неделя"; в основном разграничение. Я добавил пустой блок (с именем "weekNo") в фреймворк данных, а затем попытался использовать метод.str.split для ввода чисел в только что созданный столбец:
df[['Financial Week Name', 'weekNo']] = df['Financial Week Name'].str.split(' ', expand=True)
но получил следующую ошибку:
" ValueError: Columns must be same length as key"
Я не уверен, как получить числовое значение с конца строки "неделя х", чтобы перейти к отдельному столбцу, и попытались использовать.iloc, чтобы безуспешно срезать значения. Я довольно тупой; Любая помощь будет принята с благодарностью.
Исправляя последний комментарий, у вас может быть дополнительное место где-то в столбце Financial Week Name
. Например
Financial Week Name Day Part
week 0 Breakfast
week 0 Lunch
week 0 Dinner
week 1 Breakfast
week 1 Lunch
Эта последняя запись приведет к тому, что функция split будет создавать строку с тремя элементами, и вы передадите ее на 2 столбца, следовательно
" ValueError: Columns must be same length as key"
Я предлагаю вам просто извлечь номера из этой колонки
df['weekNo'] = df['Financial Week Name'].str.extract('(\d+)').astype(int)
Вам нужно использовать аргумент expand=True
. Это гарантирует, что разделенные столбцы будут расширены в dataframe.
Кроме того, для заказа вам нужно преобразовать week_no
в integer dtype, иначе 10 появится до 2.
df = pd.DataFrame({'week': ['week 0', 'week 1'],
'part': ['Breakfast', 'Lunch']})
# assign to expanded split
df[['week', 'week_no']] = df['week'].str.split(expand=True)
# convert to integer
df['week_no'] = df['week_no'].astype(int)
# sort by week number
df = df.sort_values('week_no')
print(df)
part week week_no
0 Breakfast week 0
1 Lunch week 1