Вычитание двух столбцов в объекте Pandas GroupBy

У меня есть набор данных с маркетинговыми кампаниями, где каждый дом получает действия кампании, такие как «флаер» или «звонок». У каждого действия есть своя собственная дата создания и окончания. В некоторых домах всего 1 действие, а в некоторых - пара.

Что я хочу сделать:

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

Поскольку у некоторых домов есть несколько действий, я решил, что могу сгруппировать все дома с помощью функции Pandas GroupBy. Кто-нибудь знает, как вычитать внутри объекта groupby?

Данные выглядят так:

house1 flyer 01-12-2014 05-12-2014
house1 phonecall 06-12-2014 06-12-2014
house2 flyer 01-12-2014 31-12-2014

мой ожидаемый результат выглядит так:

house1 ; 5 days
house2 ; 30 days
house3 ; 12 days
house4 ; 60 days
etc

person TvCasteren    schedule 15.06.2020    source источник
comment
добавить ожидаемый результат   -  person deadshot    schedule 15.06.2020
comment
добавлен ожидаемый результат   -  person TvCasteren    schedule 15.06.2020


Ответы (1)


Просто используйте функцию agg для групп:

t = df.groupby("house").agg({"start": min, "end": max})
t["duration"] = t.end - t.start

Результат:

            start        end duration
house                                
house1 2014-01-12 2014-06-12 151 days
house2 2014-01-12 2014-12-31 353 days

Изменить - создание фрейма данных

На вопрос в одном из комментариев, вот как я создал фрейм данных:

data = """house1 flyer 01-12-2014 05-12-2014
house1 phonecall 06-12-2014 06-12-2014
house2 flyer 01-12-2014 31-12-2014"""

df = pd.read_csv(StringIO(data), sep = "\s+", 
                 header = None, 
                 names = ["house", "medium", "start", "end"])

# Make sure 'start' and 'end' are dates. 
df.end = pd.to_datetime(df.end)
df.start = pd.to_datetime(df.start)
person Roy2012    schedule 15.06.2020
comment
Думаю, это сработает, но я получаю сообщение об ошибке: объект str не имеет атрибута "agg". Я думаю, это может быть связано с тем, что даты находятся в формате datetime. - person TvCasteren; 15.06.2020
comment
действительно, похоже, проблема с вашим фреймом данных. Я добавлю код, который использовал для создания фрейма данных из текста выше. - person Roy2012; 15.06.2020
comment
Спасибо, похоже, проблема с названием столбца. Это решение сработало! - person TvCasteren; 15.06.2020