gpt4 book ai didi

python - pandas:矢量化时间间隔内的计数行

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:42 25 4
gpt4 key购买 nike

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

PersonID      AnotherID
26 939 2013-02-18 06:01:00
940 2013-02-18 06:47:00
941 2013-02-19 07:02:00
...
728 65159 2014-08-14 18:40:00
729 66104 2014-08-18 09:08:00
66229 2014-08-18 17:31:00
Name: Timestamp, Length: 1886, dtype: datetime64[ns]

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

我想创建一个与 a_series 结构相同的系列,但对于每一行,计算在 A 事件之前 12 小时内发生的 b_series 中的事件数。例如,如果我们从 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

但我忍不住觉得必须有一种更有效的、“ Pandas 式”的方式。也许使用 groupby 或查找?

最佳答案

根据帧的大小和匹配的数量,使用连接操作可能会更有效:

首先,给出系列名称并将其更改为数据框:

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

然后,通过“PersonID”加入他们:

>>> df = xa.join(xb, on='PersonID', how='inner')
>>> df
PersonID AnotherID a b
6 26 762 2013-02-18 13:21:00 2013-02-18 06:01:00
6 26 762 2013-02-18 13:21:00 2013-02-18 06:47:00
6 26 762 2013-02-18 13:21:00 2013-02-19 07:02:00

现在,计算点击次数:

>>> 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

关于python - pandas:矢量化时间间隔内的计数行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com