Pandas:矢量化计算行的时间

2024-04-25 19:29:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我的情况如下。我有一系列的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类事件:

^{pr2}$

注意,虽然结构是相同的,但索引是不一样的-这意味着一个人可能拥有比事件B更多的事件a,并且可能根本没有某种类型的事件。在

我想创建一个结构相同的序列a_series,但是对于每一行,计算b峎u序列中在a事件发生前12小时发生的事件数。例如,如果我们从series_a26 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?在


Tags: nameidnewindexreturn事件情况序列
1条回答
网友
1楼 · 发布于 2024-04-25 19:29:44

根据帧的大小和匹配的数量,可能使用join操作的效率更高:

首先,给出序列名并将其更改为数据帧:

>>> a.name, b.name = 'a', 'b'
>>> xb = b.reset_index(level=-1).filter('b')
>>> xa = a.reset_index()

然后,在'PersonID'上加入它们:

^{pr2}$

现在,计算点击数:

>>> lag = np.timedelta64(12, 'h')
>>> df['cnt'] = (df['b'] < df['a']) & (df['a'] < df['b'] + lag)
>>> ts = df.groupby(['PersonID', 'AnotherID', 'a'])['cnt'].sum()
>>> ts
PersonID  AnotherID  a                  
26        762        2013-02-18 13:21:00    2
Name: cnt, dtype: float64

并且,与原始系列保持一致:

>>> xcol = ['PersonID', 'AnotherID', 'a']
>>> xa.join(ts, on=xcol).fillna(0).set_index(xcol[:-1])
                                     a  cnt
PersonID AnotherID                         
19       768       2013-02-03 13:39:00    0
         767       2013-02-03 14:03:00    0
         766       2013-02-03 15:35:00    0
         765       2013-02-03 22:32:00    0
         764       2013-02-04 11:36:00    0
         763       2013-02-04 12:07:00    0
26       762       2013-02-18 13:21:00    2
730      66901     2014-08-21 21:09:00    0
         67078     2014-08-22 23:44:00    0
         67141     2014-08-23 11:16:00    0
         67168     2014-08-23 14:53:00    0
         67216     2014-08-23 21:45:00    0

相关问题 更多 >