我有一张如下表-
时间_秒 | 价值 |
---|---|
1 | 4.5 |
2 | 4 |
3 | 3 |
4 | 5 |
5 | 6 |
6 | 7 |
7 | 6 |
8 | 5 |
9 | 4.5 |
10 | 4.2 |
11 | 3 |
12 | 3.5 |
我想找到该值低于 5 时的最短时间和最长时间。
预期产出-
时间_秒 | 价值 | 分钟_时间 | 最大时间 |
---|---|---|---|
1 | 4.5 | 1 | 3 |
2 | 4 | 1 | 3 |
3 | 3 | 1 | 3 |
4 | 5 | 空 | 空 |
5 | 6 | 空 | 空 |
6 | 7 | 空 | 空 |
7 | 6 | 空 | 空 |
8 | 5 | 空 | 空 |
9 | 4.5 | 9 | 12 |
10 | 4.2 | 9 | 12 |
11 | 3 | 9 | 12 |
12 | 3.5 | 9 | 12 |
到目前为止,我已经过滤掉了低于 5 的值,并找到了最小值和最大值,这分别给了我 1 和 12 的值。我想知道是否有什么方法可以将它们分组以找到预期的结果。
使用的代码 -
df1=df.filter(col('value')<5)
df1=(df1.withColumn('min_time',min(col('time_in_seconds'))
.withColumn('max_time',max(col('time_in_seconds')))
df=df.join(df1,['time_in_seconds','value'],'left')
在 Pandas 中你可以这样做:
data = {
"time_is_seconds": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
"value": [4.5, 4, 3, 5, 6, 7, 6, 5, 4.5, 4.2, 3, 3.5],
}
df = pd.DataFrame(data)
m = df["value"].lt(5)
g = m.ne(m.shift(1)).cumsum()
df.loc[m, "min_time"] = df.groupby(g)["time_is_seconds"].transform(min)
df.loc[m, "max_time"] = df.groupby(g)["time_is_seconds"].transform(max)
time_is_seconds value min_time max_time
0 1 4.5 1.0 3.0
1 2 4.0 1.0 3.0
2 3 3.0 1.0 3.0
3 4 5.0 NaN NaN
4 5 6.0 NaN NaN
5 6 7.0 NaN NaN
6 7 6.0 NaN NaN
7 8 5.0 NaN NaN
8 9 4.5 9.0 12.0
9 10 4.2 9.0 12.0
10 11 3.0 9.0 12.0
11 12 3.5 9.0 12.0
我没有 Pyspark 的经验,但如果您遵循相同的逻辑,这也许会对您有所帮助。