根据阈值分割数据框

时间:2020-11-04 11:47:54

标签: python pandas dataframe

如何在允许一些杂散值的同时,基于阈值将一个数据帧拆分为多个数据帧?

例如

    speed  time
0       1    20
1       1    21
2       1    22
3       1    23
4       0    24
5       0    25
6       0    26
7       1    27
8       0    28
9       0    29
10      1    30
11      1    31
12      1    32
13      0    33
14      1    34
15      1    35
16      0    36

应(阈值为0.5)给出输出:

Interval1:

    speed  time
0       1    20
1       1    21
2       1    22
3       1    23

Interval2:

10      1    30
11      1    31
12      1    32
13      0    33
14      1    34
15      1    35

在这里,阈值之上或之下的三个值的运行被认为足以分割数据帧。

我在拆分数据帧时仔细研究了各种答案,但是所有这些答案都会拆分为阈值以下的第一个值,而不是找到阈值以下的x。

总体目标是将以下内容分为4个数据帧:

1

数据是来自gps的速度,我正在尝试将它们分组为间歇锻炼。

1 个答案:

答案 0 :(得分:1)

使用具有适当阈值的centered rolling mean

代码

threshold = 0.5
df["flag"] = df["speed"].rolling(3, center=True).mean().ffill().bfill() >= threshold
df["group"] = df["flag"].diff().cumsum().bfill().astype(int)

.bfill().ffill()分别填充前NaN和后ls_out = [] for i in range(df["group"].max() + 1): # depends on the flag of the first group if (df["flag"][0] and (i % 2 == 0)) or ((not df["flag"][0]) and (i % 2 == 1)): ls_out.append(df[df["group"] == i]) for out in ls_out: print(out) speed time flag group 0 1 20 True 0 1 1 21 True 0 2 1 22 True 0 3 1 23 True 0 speed time flag group 10 1 30 True 2 11 1 31 True 2 12 1 32 True 2 13 0 33 True 2 14 1 34 True 2 15 1 35 True 2 16 0 36 True 2

输出

可以根据第一组是否低于阈值自动获得输出。

threshold=0.5

注意

window=3与{{1}}一起为这个特定的样本数据集工作只是一个巧合。在其他情况下,我建议选择适当的阈值以最好地包括组边界处的值,而不要坚持固定的阈值并执行手动环顾。