gpt4 book ai didi

python - Pandas - for循环并查找具有最接近值的索引

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:12 27 4
gpt4 key购买 nike

我基本上是在尝试遍历已分组的数据框,并找到与输入参数值最接近的索引。

例如,给定下面的数据帧,对于由 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

最佳答案

这是使用 groupby 的一种方法,但首先您需要定义一个函数来执行您在每个组中查找的内容。为了解释这个想法,让我们考虑一个简单的数据帧 dfs = pd.DataFrame({'a':[1,2,3,4,14,20,30,31]})

一段时间以来,我一直在寻找解决此类问题的方法,试图避免循环,这看起来很复杂。这是我最终的想法。在numpy中,可以使用substract结合outer来一一获取每个元素之间的所有差异

print (np.subtract.outer(dfs.a, dfs.a))
array([[ 0, -1, -2, -3, -13, -19, -29, -30],
[ 1, 0, -1, -2, -12, -18, -28, -29],
[ 2, 1, 0, -1, -11, -17, -27, -28],
[ 3, 2, 1, 0, -10, -16, -26, -27],
[ 13, 12, 11, 10, 0, -6, -16, -17],
[ 19, 18, 17, 16, 6, 0, -10, -11],
[ 29, 28, 27, 26, 16, 10, 0, -1],
[ 30, 29, 28, 27, 17, 11, 1, 0]], dtype=int64)

现在,例如,在 第 0 列 中,您可以看到差异 >10第 4 行 开始,然后转到 第 4 列,差异>10第 6 行 开始,然后转到第 6 列,差异不够大.因此过滤将保留第 0、4 和 6 行,这是要查找的值 [1,14,30]。要获得这些数字,您可以将 np.substract.outer 与 10 进行比较,并将 sumaxis=0 进行比较,例如:

arr = (np.subtract.outer(dfs.a, dfs.a) <=10).sum(0)
print (arr)
array([4, 4, 4, 5, 6, 7, 8, 8])

现在你看到了,arr[0] = 4,然后是 arr[4] = 6,然后是 arr[6]=8在此示例中超出范围,因此请停止。捕获这些数字的一种方法是使用 while(如果有人有 numpy 解决方案来执行此操作,我很感兴趣)

list_ind = [0] # initialize list of index to keep with 0
arr = (np.subtract.outer(dfs.a, dfs.a) <=10).sum(0)
i = arr[0]
while i < len(arr):
list_ind.append(i)
i = arr[i]

print (list_ind)
[0, 4, 6]

print (dfs.iloc[list_ind])
a
0 1
4 14
6 30

现在有了整个问题和 groupby,您可以:

# it seems you need to convert the column frame_no to integer
df['frame_int'] = pd.to_numeric(df['frame_no'])
df = df.sort_values('frame_int') #ensure data to be sorted by frame_int, whatever the global_id

#define the function looking for the ind
def find_ind (df_g):
list_ind = [0]
arr = (np.subtract.outer(df_g.frame_int, df_g.frame_int) <= 10).sum(0)
i = arr[0]
while i <len(arr):
list_ind.append(i)
i = arr[i]
return df_g.iloc[list_ind]

#create the filtered dataframe
df_filtered = (df.groupby('global_id').apply(find_ind)
.drop('frame_int',axis=1).reset_index(drop=True))

print (df_filtered)
seq_name label pedestrian_id frame_no global_id
0 1 crossing 1 1 1
1 1 crossing 2 1 2
2 1 crossing 2 12 2
3 1 crossing 2 29 2
4 2 crossing 1 34 3
5 2 crossing 1 49 3

如果想保留原始行的索引,可以在reset_index中添加level=0 例如reset_index(level=0,drop=True ) 代替。

关于python - Pandas - for循环并查找具有最接近值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53272116/

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