Перевод столбцов в строку на основе столбца даты

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, который выглядит как:

df1:

  ------------- ------------------- ------------ 
| date        | status            | counts     |
 ------------- ------------------- ------------ 
| 2020-03-02  |  death            |  0         |
| nan.        |  positive         |  5         |
| nan.        |  recovery         |  0         |
| nan.        |  positive cum     |  5         |
| nan.        |  recovery cum     |  0         |
| 2020-03-03  |  death            |  0         |
| nan.        |  positive         |  10        |
| nan.        |  recovery         |  0         |
| nan.        |  positive cum     |  15        |
| nan.        |  recovery cum     |  0         |
 ------------- ------------------- ------------ 
  

Я хочу повернуть фрейм данных таким образом, чтобы визуализировать таблицу:

  ------------- --------- ------------ ---------- --------------- --------------- 
| date        | death   | positive   | recovery |  positive cum | recovery cum. |
 ------------- --------- ------------ ---------- --------------- --------------- 
| 2020-03-02  |  0      |  5         | 0        | 5             | 0             |
| 2020-03-03  |  0      |  10        | 0        | 15            | 0             |
 ------------- --------- ------------ ---------- --------------- --------------- 
  

Я пробовал:

 pd.pivot_table(df, index=['date'], columns=['status'], values=['counts'], aggfunc='sum')
  

Но результаты принимают только ту строку, в которой была дата, отличная от nan. Пожалуйста, посоветуйте

Ответ №1:

Сначала ffill NaN значения в date столбце, затем используйте pivot_table with aggfunc=first для изменения формы фрейма данных:

 pvt = df.assign(date=df['date'].ffill())
        .pivot_table(index='date', columns='status', values='counts', aggfunc='first')
  

Или, если в status соответствующем конкретном date нет повторяющихся значений, вы можете вместо этого использовать pivot :

 pvt = df.assign(date=df['date'].ffill()).pivot('date', 'status', 'counts')
  

 status      death  positive  positive cum  recovery  recovery cum
date                                                             
2020-03-02      0         5             5         0             0
2020-03-03      0        10            15         0             0