Группировка pandas данных по двум столбцам (или более)?

У меня есть следующий фреймворк:

mydf = pandas.DataFrame({"cat": ["first", "first", "first", "second", "second", "third"], "class": ["A", "A", "A", "B", "B", "C"], "name": ["a1", "a2", "a3", "b1", "b2", "c1"], "val": [1,5,1,1,2,10]})

Я хочу создать dataframe, который делает сводную статистику о столбце val элементов с тем же идентификатором class. Для этого я использую groupby следующим образом:

mydf.groupby("class").val.sum()

что правильное поведение, но я хотел бы сохранить информацию столбца cat в полученном df. это можно сделать? мне нужно merge/join эту информацию позже? Я пробовал:

mydf.groupby(["cat", "class"]).val.sum()

но это использует иерархическую индексацию. Я хотел бы иметь простой фреймворк, который имеет только значение cat для каждой группы, где группа class. Выходом должен быть dataframe (не серия) со значениями cat и class, где записи val суммируются по каждой записи, которая имеет тот же class:

cat     class    val
first   A         7
second  B         3
third   C        10

Это возможно?

Ответ 1

Используйте reset_index

In [9]: mydf.groupby(['cat', "class"]).val.sum().reset_index()
Out[9]: 
      cat class  val
0   first     A    7
1  second     B    3
2   third     C   10

ИЗМЕНИТЬ

установите уровень = 1, если вы хотите установить cat как индекс

In [10]: mydf.groupby(['cat', "class"]).val.sum().reset_index(level=1)
Out[10]: 
       class  val
cat              
first      A    7
second     B    3
third      C   10

Вы также можете установить as_index=False для получения того же выхода

In [29]: mydf.groupby(['cat', "class"], as_index=False).val.sum()
Out[29]: 
      cat class  val
0   first     A    7
1  second     B    3
2   third     C   10