我的情况如下。我有一系列的A型事件(a_series
),由PersonID和另一个与问题无关的ID建立索引:
PersonID AnotherID
19 768 2013-02-03 13:39:00
767 2013-02-03 14:03:00
766 2013-02-03 15:35:00
765 2013-02-03 22:32:00
764 2013-02-04 11:36:00
763 2013-02-04 12:07:00
26 762 2013-02-18 13:21:00
...
730 66901 2014-08-21 21:09:00
67078 2014-08-22 23:44:00
67141 2014-08-23 11:16:00
67168 2014-08-23 14:53:00
67216 2014-08-23 21:45:00
Name: Timestamp, Length: 34175, dtype: datetime64[ns]
我还有另一个系列(b_series
),构建完全相同,但描述的是B类事件:
注意,虽然结构是相同的,但索引是不一样的-这意味着一个人可能拥有比事件B更多的事件a,并且可能根本没有某种类型的事件。在
我想创建一个结构相同的序列a_series
,但是对于每一行,计算b峎u序列中在a事件发生前12小时发生的事件数。例如,如果我们从series_a
取26 762 2013-02-18 13:21:00
行,它的值应该是2。在
我已经用apply做到了,就像这样:
def apply_func(x, series_b):
try:
return series_b.loc[x['PersonID']].\
between(x['Timestamp'] - timedelta(hours = 12), x['Timestamp']).sum()
except KeyError:
return 0
new_series = series_a.apply(apply_func, axis = 1, args = (seriesb,))
new_series.index = series_a.index
但我还是忍不住觉得必须有更高效的“熊猫ic”方式。也许是groupby或lookup?在
根据帧的大小和匹配的数量,可能使用join操作的效率更高:
首先,给出序列名并将其更改为数据帧:
然后,在
^{pr2}$'PersonID'
上加入它们:现在,计算点击数:
并且,与原始系列保持一致:
相关问题 更多 >
编程相关推荐