Группировка 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