Как проверить аггрегированное значения группы?
В наборе данных есть такой DataFrame:
класс процент доп_инфа
первый 60 впрвер
первый 40 рверв
второй 50 пыкпыевн
второй 20 ервер
третий 80 кнукнф
третий 10 венврке
Необходимо узнать, какие классы НЕ имеют сумму 100. В моём случае - это второй и третий. Таким образом, ответом должен быть:
Out[]:
класс процент
второй 70
третий 90
Попытался сделать вот так, но выводит полностью DataFrame со значениями NaN:
sm = data[data.groupby('класс').sum()]
data.where(sm != 100)
Ответы (2 шт):
Автор решения: Danis
→ Ссылка
в pandas не разбираюсь:
dict_ = {}
for class_, procent in zip(data["класс"], data["процент"]):
try:
dict_[class_] +=procent
except:
dict_[class_] = procent
for class_, procent in dict_.items():
if procent == 100:
continue
print(class_, procent)
Автор решения: MaxU
→ Ссылка
Вариант 1
группируем, суммируем, фильтруем по сумме:
res = df.groupby("класс")["процент"].sum().reset_index().query("процент != 100")
Вариант 2
Сначала получаем индексы строк, для которых сумма в столбце процент не равна 100. Затем фильтруем, группируем и суммируем:
idx = df.groupby("класс")["процент"].filter(lambda x: x.sum() != 100).index
res = df.loc[idx].groupby("класс")["процент"].sum().reset_index()
Результат:
In [13]: res
Out[13]:
класс процент
0 второй 70
1 третий 90