#python #pandas #sorting #rows #reindex
#python #pandas #сортировка #строки #переиндексация
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом:
product units_sold week
sku 5 W01
sku 3 W02
sku 2 W03
sku 4 W04
sku 6 W05
sku 5 W36
sku 3 W38
sku 2 W39
sku 4 W40
В «неделе» w37 отсутствует, а столбцы расположены в неправильной последовательности:
У меня есть список со всеми необходимыми строками и правильной последовательностью:
week_list = ['W36','W37','W38','W39','W40','W01','W02','W03','W04','W05']
желаемый результат:
product units_sold week
sku 5 W36
sku 0 W37
sku 5 W38
sku 2 W39
sku 4 W40
sku 6 W01
sku 3 W02
sku 2 W03
sku 4 W04
sku 6 W05
Где W37 находится на месте, а ‘unit_sold’ равно 0
Просто добавить один столбец решение не подходит, так как у меня довольно большой фрейм данных, и, вероятно, могут быть другие недостающие строки.
Я пробовал с помощью pd.sort_values и pd.categorical:
def sorter(column):
reorder = week_list
cat = pd.Categorical(column, categories=reorder, ordered=True)
return pd.Series(cat)
df.sort_values(by="week", key=sorter)
это помогло мне установить правильную последовательность, но ‘w37’ по-прежнему отсутствует, поэтому проблема не решена.
Могу ли я каким-либо образом обновить значения строк фрейма данных на основе этого списка?
Комментарии:
1. Что, если вы выполните следующие действия — 1. Сохраните список недель в фрейме данных. 2. Присоедините свою таблицу к этому фрейму данных 3. Замените null в столбце недели на 0 и отсортируйте по неделям
Ответ №1:
IIUC просто использует reindex
:
print (df.set_index("week").reindex(week_list).fillna({"product":"sku", "units_sold": 0}))
product units_sold
week
W36 sku 5.0
W37 sku 0.0
W38 sku 3.0
W39 sku 2.0
W40 sku 4.0
W01 sku 5.0
W02 sku 3.0
W03 sku 2.0
W04 sku 4.0
W05 sku 6.0