Обновление строк в фрейме данных Pandas на основе значений списка

#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