python - 使用 pandas 查找时间序列中重复发生的事件

标签 python pandas time-series

我有一个时间序列的事件,我想计算该时间序列中每种类型的事件之前非连续发生的次数。我想用 Pandas 做这个。我可以通过迭代这些项目来完成它,但我想知道是否有一种聪明的方法可以在不循环的情况下完成它。

为了说得更清楚。考虑以下时间序列:

dates = pd.date_range('1/1/2011', periods=4, freq='H')
data = ['a', 'a', 'b', 'a']
df = pd.DataFrame(data,index=dates,columns=["event"])

                    event
2011-01-01 00:00:00   a
2011-01-01 01:00:00   a
2011-01-01 02:00:00   b
2011-01-01 03:00:00   a

我想添加一个新列,用于告诉“事件”列中的每个元素该元素之前出现过多少次非连续次数。也就是说,像这样:

                    event #prev-occurr
2011-01-01 00:00:00   a        0
2011-01-01 01:00:00   a        0
2011-01-01 02:00:00   b        0
2011-01-01 03:00:00   a        1

最佳答案

我们还没有对连续组提供良好的groupby支持,但我们可以使用shift-compare-cumsum模式,然后使用密集排名来获得您所需要的,IIUC:

>>> egroup = (df["event"] != df["event"].shift()).cumsum()
>>> df["prev_occur"] = egroup.groupby(df["event"]).rank(method="dense") - 1
>>> df
                    event  prev_occur
2011-01-01 00:00:00     a           0
2011-01-01 01:00:00     a           0
2011-01-01 02:00:00     b           0
2011-01-01 03:00:00     a           1
2011-01-01 04:00:00     a           1
2011-01-01 05:00:00     b           1
2011-01-01 06:00:00     a           2

这是有效的,因为我们获得了连续的事件组计数:

>>> egroup
2011-01-01 00:00:00    1
2011-01-01 01:00:00    1
2011-01-01 02:00:00    2
2011-01-01 03:00:00    3
2011-01-01 04:00:00    3
2011-01-01 05:00:00    4
2011-01-01 06:00:00    5
Freq: H, Name: event, dtype: int64

然后我们可以按事件类型对其进行分组,从而得到非排名版本:

>>> for k,g in egroup.groupby(df["event"]):
...     print(g)
...     
2011-01-01 00:00:00    1
2011-01-01 01:00:00    1
2011-01-01 03:00:00    3
2011-01-01 04:00:00    3
2011-01-01 06:00:00    5
Name: event, dtype: int64
2011-01-01 02:00:00    2
2011-01-01 05:00:00    4
Name: event, dtype: int64

我们终于可以对其进行密集排名了。

关于python - 使用 pandas 查找时间序列中重复发生的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128599/

相关文章:

python - 如何删除 Pandas 中的重复项?

python - Tensorflow 中间歇振荡器的 LSTM 时间序列预测

python - 错误 : ValueWarning: A date index has been provided, 但它没有关联的频率信息,因此在例如预测

python - 如何将训练后的 SVM 输出保存到文件中? (OpenCV/SimpleCV)

python 搜索硬盘上的文件并复制到 USB

python - Pandas Dataframe 删除索引条件为 true 的项目

python - 创建数据透视表并获取 Pandas Dataframe 中的计数

Python 多处理队列比 pool.map 慢

python - Pandas Dataframe 过滤器不工作,但 str.match() 正在工作

django - Django/Python 中的实时数据处理