【问题标题】:Subtracting two columns within a Pandas GroupBy object在 Pandas GroupBy 对象中减去两列
【发布时间】:2020-10-04 12:06:29
【问题描述】:

我有一个包含营销活动的数据集,其中每个房子都会收到诸如“传单”或“电话”之类的活动操作。每个动作都有自己的创建和结束日期。有些房子只有一个动作,有些有几个。

我想做的是:

我想计算每个房子的广告系列的长度,即每个房子的第一个动作(例如传单)和最后记录的动作之间的时间。如果每个房子只有 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

【问题讨论】:

  • 添加预期输出
  • 添加了预期输出

标签: python pandas


【解决方案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

编辑 - 创建数据框

根据其中一个 cmets 中的问题,这是我创建数据框的方式:

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)

【讨论】:

  • 我认为这会起作用,但我收到错误消息“str object has no attribute 'agg'”。我认为这可能是由于日期采用日期时间格式。
  • 确实,这似乎是您的数据框的问题。我将添加用于从上面的文本创建数据框的代码。
  • 谢谢,列名似乎有问题。这个解决方案奏效了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 2020-03-26
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多