【发布时间】:2016-09-07 06:25:57
【问题描述】:
我有一些交易的DataFrame。我想根据它们的 item 和 time 列值对这些事务进行分组:目标是对彼此相隔 1 小时内的项目进行分组。因此,我们在下一次观察时开始一个新组,该组不在之前观察的一小时内(参见DataFrameB 中的start time 列)。
这是数据:我想将A 转换为B。
A=
item time result
A 2016-04-18 13:08:25 Y
A 2016-04-18 13:57:05 N
A 2016-04-18 14:00:12 N
A 2016-04-18 23:45:50 Y
A 2016-04-20 16:53:48 Y
A 2016-04-20 17:11:47 N
B 2016-04-18 15:24:48 N
C 2016-04-23 13:20:44 N
C 2016-04-23 14:02:23 Y
B=
item start time end time Ys Ns total count
A 2016-04-18 13:08:25 2016-04-18 14:08:25 1 2 3
A 2016-04-18 23:45:50 2016-04-18 00:45:50 1 0 1
A 2016-04-20 16:53:48 2016-04-20 17:53:48 1 1 2
B 2016-04-18 15:24:48 2016-04-18 16:24:48 0 1 1
C 2016-04-23 13:20:44 2016-04-23 14:20:44 1 1 2
这是我所做的:
grouped = A.groupby('item')
A['end'] = (grouped['time'].transform(lambda grp: grp.min()+pd.Timedelta(hours=1)))
A2 = A.loc[(A['time'] <= A['end'])]
这给了我每天一组:第一笔交易后 1 小时内的交易。因此,我错过了同一天的其他交易,但与第一笔交易相距超过 1 小时。我的斗争是如何获得这些群体。然后我可以使用pd.crosstab 从result 列中获取我想要的详细信息。
我的另一个想法是将A 按item 和time 排序,然后逐行进行。如果时间在前一行的 1 小时内,则添加到该组,否则,它会创建一个新组。
【问题讨论】:
-
还有很多问题没有得到解答。比如,在一小时内分组?第一次观察一小时?下一个小时呢?它会在最后一小时结束时开始吗?或者我们是否在下一次观察时开始新的一小时,而不是在前一次观察的一小时内?
-
您的代码中的
grouped是什么?你是怎么得到它的? -
@piRSquared 我在问题中添加了更多细节以澄清。
-
@MaxU 我按项目分组,我将其添加到问题中。
标签: python datetime pandas grouping python-datetime