Мне нужно воспроизвести с пандами то, что SQL делает так легко:
select
del_month
, sum(case when off0_on1 = 1 then 1 else 0 end) as on1
, sum(case when off0_on1 = 0 then 1 else 0 end) as off0
from a1
group by del_month
order by del_month
Вот пример, иллюстративный кадр данных панд для работы:
a1 = pd.DataFrame({'del_month':[1,1,1,1,2,2,2,2], 'off0_on1':[0,0,1,1,0,1,1,1]})
Вот мои попытки воспроизвести вышеуказанный SQL с помощью панд. Первая строка работает. Вторая строка выдает ошибку:
a1['on1'] = a1.groupby('del_month')['off0_on1'].transform(sum)
a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(sum(lambda x: 1 if x == 0 else 0))
Вот ошибка второй строки:
TypeError: 'function' object is not iterable
Этот мой предыдущий вопрос имел проблему с лямбда-функцией, которая была решена. Большая проблема заключается в том, как воспроизвести логику SQL «сумма (случай, когда)» для сгруппированных данных. Я ищу общее решение, так как мне нужно часто делать подобные вещи. Ответы на мой предыдущий вопрос предложили использовать map () внутри лямбда-функции, но следующие результаты для столбца «off0» не то, что мне нужно. Столбец "on1" - это то, что я хочу. Ответ должен быть одинаковым для всей группы (то есть "del_month").