Сводная таблица в pandas без аггрегации

Рейтинг: 0Ответов: 1Опубликовано: 22.02.2023

У меня есть датафрейм:

df = pd.DataFrame({'user_id' : [44, 44, 998, 998, 998], 
                'content': ['course_1', 'course_2', 'course_1', 'course_2', 'course_3'],
                   'status': ['progress', 'done', 'progress', 'done', 'no_access'],
                   'date_begin': ['2020-12-18', '2020-11-13', '2020-11-13', '2021-02-25', 'NaN']
              })
print(df)

   user_id   content     status  date_begin
0       44  course_1   progress  2020-12-18
1       44  course_2       done  2020-11-13
2      998  course_1   progress  2020-11-13
3      998  course_2       done  2021-02-25
4      998  course_3  no_access  NaN          

Мне необходимо сгруппировать таблицу таким образом, чтобы получилось следующее:

   user_id  course_1 date_begin_(course_1) course_2 date_begin_(course_2)  \
0       44  progress            2020-12-18     done            2020-11-13   
1      998  progress            2020-11-13     done            2021-02-25   

    course_3 date_begin_(course_3) 
0        NaN                   NaN  
1  no_access                   NaN  

Пока я придумал только метод pivot

df.pivot(index='user_id', columns='content', values=['status', 'date_begin'])

который даёт следующий результат:

           status                      date_begin                     
content  course_1 course_2   course_3    course_1    course_2 course_3
user_id                                                               
44       progress     done        NaN  2020-12-18  2020-11-13      NaN
998      progress     done  no_access  2020-11-13  2021-02-25      NaN

Результат близок к тому, который мне нужен, но мне нужно 1) поменять порядок столбцов и 2) переименовать столбцы "data_begin" в "data_begin (название курса)".

Прошу знающих людей подсказать.

Ответы

▲ 0Принят

Преобразуем мультииндекс по столбцам в список кортежей вида (номер для сортировки, название столбца), потом меняем названия столбцов, и, наконец, сортируем столбцы в нужном порядке.

df = pd.DataFrame({'user_id': [44, 44, 998, 998, 998],
                   'content': ['course_1', 'course_2', 'course_1', 'course_2', 'course_3'],
                   'status': ['progress', 'done', 'progress', 'done', 'no_access'],
                   'date_begin': ['2020-12-18', '2020-11-13', '2020-11-13', '2021-02-25', 'NaN']})
df = df.pivot(index='user_id', columns='content', values=['status', 'date_begin'])
cols = []
for x, y in df.columns:
    num = int(y.split('_')[-1])
    cols.append((num * 100, y) if x == 'status' else (num * (100 + 1), f'{x}_({y})'))
df.columns = [x for _, x in cols]
df = df[[x for _, x in sorted(cols)]]
print(df)
         course_1 date_begin_(course_1) course_2 date_begin_(course_2)   course_3 date_begin_(course_3)
user_id                                                                                                
44       progress            2020-12-18     done            2020-11-13        NaN                   NaN
998      progress            2020-11-13     done            2021-02-25  no_access                   NaN