пользовательская функция агрегирования панд - PullRequest
1 голос
/ 23 июня 2019

У меня есть фрейм данных pandas, с которым работает следующая команда:

house.groupby(['place_name'])['index_nsa'].agg(['first','last'])

Это дает мне то, что я хочу. Теперь я хочу создать собственное значение агрегации, которое даст мне процентное изменение между первым и последним значением.

Я получил ошибку при выполнении математических операций со значениями, поэтому я предположил, что мне нужно превратить их в числа.

house.groupby(['place_name'])['index_nsa'].agg({"change in %":[(int('last')-int('first')/int('first')]})

К сожалению, я получаю только синтаксическую ошибку в последней скобке, которая, кажется, не может найти ошибку.

Кто-то видит, где я ошибся?

1 Ответ

1 голос
/ 23 июня 2019

Вам нужно определить и передать обратный вызов agg здесь. Вы можете сделать это с помощью лямбда-функции:

house.groupby(['place_name'])['index_nsa'].agg([
    ("change in %", lambda x: (x.iloc[-1] - x.iloc[0]) / x.iloc[0])])

Посмотрите внимательно на .agg call - чтобы разрешить переименование выходного столбца, вы должны передать список кортежей в формате [(new_name, agg_func), ...]. Подробнее здесь .

Если вы хотите избежать лямбды за счет некоторого многословия, вы можете использовать

def first_last_pct(ser):
    first, last = ser.iloc[0], ser.iloc[-1]
    return (last - first) / first

house.groupby(['place_name'])['index_nsa'].agg([("change in %", first_last_pct)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...