首页 > 解决方案 > 计算超出限制的连续行数

问题描述

我有一个数据框,其中包含每 0.1 秒的名称和速度测量值。我想计算速度在 0.3 秒内超过速度限制的次数(即连续 3 行)。

limit = 25.3

Name   speed   time
Mary   25.6    0.1
Mary   25.8    0.2
Mary   25.1    0.3
Mary   24.4    0.4
Mary   24.2    0.5
Mary   25.8    0.6
Mary   25.9    0.7
Mary   25.8    0.8
Mary   25.4    0.9
Mary   24.9    1.0
Mary   25.6    1.1
Mary   25.8    1.2
Mary   26.2    1.3

结果

{Mary: 2}

标签: pythonpandasdataframe

解决方案


第一个想法是通过连续值创建组并聚合每个 grsoups 和 的计数Name,过滤是否大于或等于 likelimit并再次按Names 计数:

limit = 25.3

m = df['speed'].gt(limit)
s = df.groupby([(~m).shift().bfill()[m].cumsum(),'Name']).size()
s = s[s.ge(3)].groupby(level=1).size()
print (s)
Mary    2
dtype: int64

或者创建连续值的计数器,过滤等于3和计数Series.value_counts

limit = 25.3

m = df['speed'].gt(limit)

#https://stackoverflow.com/a/52718619/2901002
b = m.cumsum()
c = b.sub(b.mask(m).ffill().fillna(0)).astype(int)

df['count'] = c
print (df)

s = df.loc[df['count'].eq(3), 'Name'].value_counts()
print (s)
Mary    2
Name: Name, dtype: int64

推荐阅读