Синтаксис лямбда-функции Python для преобразования групп данных в пандах - PullRequest
0 голосов
/ 01 ноября 2018

Это должен быть очень простой вопрос. У меня есть две строки кода. Первый работает. Второе дает следующую ошибку:

SyntaxError: invalid syntax

Вот две строки кода. Первая строка (которая работает нормально) подсчитывает строки, где off0_on1 == 1. Вторая строка пытается подсчитать строки, где off0_on1 == 0.

a1['on1'] = a1.groupby('del_month')['off0_on1'].transform(sum)
a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda x: 1 if x == 0)

Вот кадр данных панд:

a1 = pd.DataFrame({'del_month':[1,1,1,1,2,2,2,2], 'off0_on1':[0,0,1,1,0,1,1,1]})

Есть предложения пересмотреть вторую строку кода выше?

Изменить: В двух ответах предложено использовать функцию карты, которая выдает следующий результат. Столбец «on1» подходит для моих целей; столбец "off0" неверен. Для первого «del_month» столбец «off0» должен иметь те же результаты, что и столбец «on1». Для второго «del_month» в столбце «off0» должны быть все единицы (т. Е. 1, 1, 1, 1).

Вот что происходит, когда я использую следующую функцию карты (см. Изображение ниже):

a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda series: map(lambda x: 1 if x == 0 else 0, series))

enter image description here

Редактировать 2 Не уверен, что это прояснит ситуацию, но в конечном итоге я хочу, чтобы панды сделали то, что следующий код 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

Редактировать 3 Этот новый вопрос содержит ответ, который мне нужен. Спасибо всем!

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Ваш код: lambda x: 1 if x == 0 не является допустимым выражением. Попробуйте что-то вроде lambda x: 1 if x == 0 else 0

См. Ниже:

>>> example = lambda x: 1 if x == 0 else 0
>>> example(0)
1
>>> example(1)
0
0 голосов
/ 01 ноября 2018

Предыдущие ответы быстро исправили ошибку лямбда-функции, добавив в конце «else 0». На мой окончательный вопрос ответили здесь со следующей строкой кода:

a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda x: sum(x==0)) 
0 голосов
/ 01 ноября 2018

Когда вы определяете оператор if (сокращенный способ), вам также необходимо определить else.

lambda x: 1 if x == 0 else 0 # For example.

EDIT:

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

a1['off0'] = a1.groupby('del_month')['off0_on1'].transform(lambda x: map(lambda value: 1 if value == 0 else 0, x))
...