熊猫高级条件组

时间:2018-04-07 20:33:37

标签: python pandas

对于每月的每一天(1-31),我想计算当天任何60分钟内发生的行程次数,因此第一个条目是0:00,我想得到的数量从0:00到1:00旅行,第二次是0:01,我想从0:01到1:01获得旅行次数。

并且必须在同一天内,所以从23:00起,您不需要计算旅行次数

如何对此进行分组?

enter image description here

2 个答案:

答案 0 :(得分:0)

我会通过几个步骤完成此操作:

  • 按照取件时间进行分组并计算每分钟发生的次数(我假设您根据取件时间进行此操作),请拨打此数据框by_minute
  • 与自身交叉加入by_minute(因此您拥有笛卡尔积)并过滤到两个拾取时间满足条件的行
  • 分组("左手")拾取时间并将"右手"的数量相加。游

我相信你必须在by_minute添加一个虚拟列以方便连接。类似的东西:

by_minute['key'] = 1
joined = by_minute.merge(by_minute, on='key')

还提到了其他一些选项this questionmerge有一个suffixes参数(默认情况下它是('_x', '_y'),可以区分列名。

答案 1 :(得分:0)

正如我在评论中写到的那样,据我所知,你不是在寻找一个组合,而是在每一行上进行一些操作。
我使用apply提出了以下解决方案:

s = pd.to_datetime(df["pickup_datetime"])    # make sure the pickup column is datetime
r = s.apply(lambda x: np.sum(s.between(x, x + pd.Timedelta("1hr")) & (s.dt.dayofyear == x.dayofyear)))

让我们分解:
这将遍历每一行(apply)并根据两个条件创建一个布尔掩码:

  • 从当前取件时间起一小时内的所有取件时间。
  • 与当前取件时间在同一日期(一年中的某一天)内的所有取件时间。

然后我们将它们与AND操作(&)结合起来 这样就可以在满足两个条件的地方创建一个与True系列相同的布尔数组 最后,我们总结(np为Numpy)这个布尔数组,相当于计算满足上述条件的条目数。