【发布时间】:2018-11-14 00:27:59
【问题描述】:
我基本上是在尝试遍历已分组的数据框并找到与输入参数具有最接近值的索引。
例如,给定下面的数据帧,对于由global_id 定义的每个组,我想分组以获取间隔至少 10 帧的帧。例如,如果我有一个帧列表 [1,2,3,4,14,20,30,31],输出将是 [1,14,30] 因为
- 我将通过将第 1 帧作为第一帧进行初始化
- 至少相隔 10 帧的下一帧将是第 14 帧
- 距第 14 帧至少 10 帧的后续帧为 30
因此,数据帧前后的结果应如下所示
之前
seq_name label pedestrian_id frame_no global_id
0 0001 crossing 0001 0001 1
1 0001 crossing 0001 0002 1
2 0001 crossing 0001 0003 1
3 0001 crossing 0001 0004 1
4 0001 crossing 0001 0005 1
5 0001 crossing 0001 0006 1
6 0001 crossing 0001 0007 1
7 0001 crossing 0001 0008 1
8 0001 crossing 0001 0009 1
9 0001 crossing 0001 0010 1
10 0001 crossing 0002 0001 2
11 0001 crossing 0002 0012 2
12 0001 crossing 0002 0013 2
13 0001 crossing 0002 0014 2
14 0001 crossing 0002 0015 2
15 0001 crossing 0002 0029 2
16 0001 crossing 0002 0030 2
17 0001 crossing 0002 0031 2
18 0001 crossing 0002 0032 2
19 0001 crossing 0002 0033 2
20 0002 crossing 0001 0034 3
21 0002 crossing 0001 0035 3
22 0002 crossing 0001 0036 3
23 0002 crossing 0001 0037 3
24 0002 crossing 0001 0038 3
25 0002 crossing 0001 0039 3
26 0002 crossing 0001 0049 3
27 0002 crossing 0001 0050 3
28 0002 crossing 0001 0051 3
29 0002 crossing 0001 0052 3
过滤后
seq_name label pedestrian_id frame_no global_id
0 0001 crossing 0001 0001 1
10 0001 crossing 0002 0001 2
11 0001 crossing 0002 0012 2
15 0001 crossing 0002 0029 2
25 0002 crossing 0001 0039 3
26 0002 crossing 0001 0049 3
以下是我所拥有的。一旦我有了索引,我就可以通过从旧的索引来创建一个新的数据框。我还是 Pandas 的新手,它看起来非常麻烦,所以我希望有一个更优雅的解决方案。我已经阅读了关于 groupby 的文档和其他一些 SO 帖子,但仍然无法弄清楚。这不是家庭作业。只是想通过用 Pandas 替换所有内容来清理我的数据处理管道。
ind = []
for j in df["global_id"].unique():
df_temp = df[df["global_id"] == j][["frame_no"]]
df_temp["frame_no"] = pd.to_numeric(df["frame_no"])
start_frame = df_temp["frame_no"].min()
end_frame = df_temp["frame_no"].max()
i = start_frame-1
while i < end_frame:
ind.append(np.min(df_temp[(df_temp["frame_no"] > i) & (df_temp["frame_no"] < i+10)].index.tolist()))
i+=10
【问题讨论】: