gpt4 book ai didi

python - Pandas - 计算列值大于阈值限制的连续行

转载 作者:行者123 更新时间:2023-12-03 21:47:49 31 4
gpt4 key购买 nike

我有一个数据框,其中在特定时间范围内记录了几个人的速度。下面是一个简化版:

df = pd.DataFrame([["Mary",0,2.3], ["Mary",1,1.8], ["Mary",2,3.2],
["Mary",3,3.0], ["Mary",4,2.6], ["Mary",5,2.2],
["Steve",0,1.6], ["Steve",1,1.7], ["Steve",2,2.5],
["Steve",3,2.7], ["Steve",4,2.3], ["Steve",5,1.8],
["Jane",0,1.9], ["Jane",1,2.7], ["Jane",2,2.3],
["Jane",3,1.9], ["Jane",4,2.2], ["Jane",5,2.1]],
columns = [ "name","time","speed (m/s)" ])

print(df)
name time (s) speed (m/s)
0 Mary 0 2.3
1 Mary 1 1.8
2 Mary 2 3.2
3 Mary 3 3.0
4 Mary 4 2.6
5 Mary 5 2.2
6 Steve 0 1.6
7 Steve 1 1.7
8 Steve 2 2.5
9 Steve 3 2.7
10 Steve 4 2.3
11 Steve 5 1.8
12 Jane 0 1.9
13 Jane 1 2.7
14 Jane 2 2.3
15 Jane 3 1.9
16 Jane 4 2.2
17 Jane 5 2.1
我正在寻找一种方法来计算每个名称的速度大于 2 m/s 的次数(连续 2 个或更多记录),以及这些间隔时间的平均持续时间。真实的数据帧有超过 150 万行,这使得循环效率低下。
我期望的结果如下所示:
     name  count  average_duration(s)
0 Mary 1 4 # from 2 to 5s (included) - 1 time, 4/1 = 4s
1 Steve 1 3 # from 2 to 4s (included) - 1 time, 3/1 = 3s
2 Jane 2 2 # from 1 to 2s & from 4 to 5s (included) - 2 times, 4/2 = 2s
我在这个问题上花了一天多的时间,没有成功......
预先感谢您的帮助!

最佳答案

所以这是我的出发点:

df['over2'] = df['speed (m/s)']>2
df['streak_id'] = (df['over2'] != df['over2'].shift(1)).cumsum()
streak_groups = df.groupby(['name','over2','streak_id'])["time"].agg(['min','max']).reset_index()
positive_streaks = streak_groups[streak_groups['over2'] & (streak_groups['min'] != streak_groups['max'])].copy()
positive_streaks["duration"] = positive_streaks["max"] - positive_streaks["min"] + 1
result = positive_streaks.groupby('name')['duration'].agg(['size', 'mean']).reset_index()
print(result)
输出:
    name  size  mean
0 Jane 2 2
1 Mary 1 4
2 Steve 1 3
我基本上给每个 False/True 连胜一个唯一的 ID 以便能够通过它进行分组,所以每个组都是这样一个连续的结果。
然后我简单地将持续时间作为最大时间 - 最小时间,去掉 len 1 的条纹,然后通过名称获得分组的大小和平均值。
如果你想更好地理解每一步,我建议打印我一路上的中间数据帧。

关于python - Pandas - 计算列值大于阈值限制的连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63673211/

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