我下面有一个数据框,其中seq_name
是视频的名称,pedestrian_id
是该视频中行人的名称,frame_no
是在视频中包含该行人的帧视频。因此,对于以下示例,我有2个视频0001
和0002
,共有3个行人。
我正在尝试根据这些信息将他们分组,为他们分配一个global_id
,以便为每个唯一行人分配一个ID,从1到行人总数。
seq_name label pedestrian_id frame_no global_id
0 0001 crossing 0001 0001.png -1
1 0001 crossing 0001 0002.png -1
2 0001 crossing 0001 0003.png -1
3 0001 crossing 0001 0004.png -1
4 0001 crossing 0001 0005.png -1
5 0001 crossing 0001 0006.png -1
6 0001 crossing 0001 0007.png -1
7 0001 crossing 0001 0008.png -1
8 0001 crossing 0001 0009.png -1
9 0001 crossing 0001 0010.png -1
10 0001 crossing 0002 0001.png -1
11 0001 crossing 0002 0002.png -1
12 0001 crossing 0002 0003.png -1
13 0001 crossing 0002 0004.png -1
14 0001 crossing 0002 0005.png -1
15 0001 crossing 0002 0006.png -1
16 0001 crossing 0002 0007.png -1
17 0001 crossing 0002 0008.png -1
18 0001 crossing 0002 0009.png -1
19 0001 crossing 0002 0010.png -1
20 0002 crossing 0001 0001.png -1
21 0002 crossing 0001 0002.png -1
22 0002 crossing 0001 0003.png -1
23 0002 crossing 0001 0004.png -1
24 0002 crossing 0001 0005.png -1
25 0002 crossing 0001 0006.png -1
26 0002 crossing 0001 0007.png -1
27 0002 crossing 0001 0008.png -1
28 0002 crossing 0001 0009.png -1
29 0002 crossing 0001 0010.png -1
最终数据帧应如下所示
seq_name label pedestrian_id frame_no global_id
0 0001 crossing 0001 0001.png 1
1 0001 crossing 0001 0002.png 1
2 0001 crossing 0001 0003.png 1
3 0001 crossing 0001 0004.png 1
4 0001 crossing 0001 0005.png 1
5 0001 crossing 0001 0006.png 1
6 0001 crossing 0001 0007.png 1
7 0001 crossing 0001 0008.png 1
8 0001 crossing 0001 0009.png 1
9 0001 crossing 0001 0010.png 1
10 0001 crossing 0002 0001.png 2
11 0001 crossing 0002 0002.png 2
12 0001 crossing 0002 0003.png 2
13 0001 crossing 0002 0004.png 2
14 0001 crossing 0002 0005.png 2
15 0001 crossing 0002 0006.png 2
16 0001 crossing 0002 0007.png 2
17 0001 crossing 0002 0008.png 2
18 0001 crossing 0002 0009.png 2
19 0001 crossing 0002 0010.png 2
20 0002 crossing 0001 0001.png 3
21 0002 crossing 0001 0002.png 3
22 0002 crossing 0001 0003.png 3
23 0002 crossing 0001 0004.png 3
24 0002 crossing 0001 0005.png 3
25 0002 crossing 0001 0006.png 3
26 0002 crossing 0001 0007.png 3
27 0002 crossing 0001 0008.png 3
28 0002 crossing 0001 0009.png 3
29 0002 crossing 0001 0010.png 3
看起来很简单,但是我是熊猫的新手,遇到了很多麻烦。我唯一要做的就是在附加新列之前根据seq_name
和pedestrian_id
对它们进行分组。但是,当我打印数据时,它看起来不再类似于上面的ID,而且看起来global_id已附加到新行而不是新列。需要帮助。
df = df.groupby(['seq_name','pedestrian_id']).agg(lambda x: x.tolist())
df["global_id"] = range(1, len(df)+1)
答案 0 :(得分:3)
df["global_id"] = df.groupby(['seq_name','pedestrian_id']).ngroup() + 1
使用factorize
的另一种解决方案:
s = df['seq_name'].astype(str) +'_' +df['pedestrian_id'].astype(str)
s = list(map(tuple, df[['seq_name','pedestrian_id']].values.tolist()))
df["global_id"] = pd.factorize(s)[0] + 1
print (df)
seq_name label pedestrian_id frame_no global_id
0 1 crossing 1 0001.png 1
1 1 crossing 1 0002.png 1
2 1 crossing 1 0003.png 1
3 1 crossing 1 0004.png 1
4 1 crossing 1 0005.png 1
5 1 crossing 1 0006.png 1
6 1 crossing 1 0007.png 1
7 1 crossing 1 0008.png 1
8 1 crossing 1 0009.png 1
9 1 crossing 1 0010.png 1
10 1 crossing 2 0001.png 2
11 1 crossing 2 0002.png 2
12 1 crossing 2 0003.png 2
13 1 crossing 2 0004.png 2
14 1 crossing 2 0005.png 2
15 1 crossing 2 0006.png 2
16 1 crossing 2 0007.png 2
17 1 crossing 2 0008.png 2
18 1 crossing 2 0009.png 2
19 1 crossing 2 0010.png 2
20 2 crossing 1 0001.png 3
21 2 crossing 1 0002.png 3
22 2 crossing 1 0003.png 3
23 2 crossing 1 0004.png 3
24 2 crossing 1 0005.png 3
25 2 crossing 1 0006.png 3
26 2 crossing 1 0007.png 3
27 2 crossing 1 0008.png 3
28 2 crossing 1 0009.png 3
29 2 crossing 1 0010.png 3
答案 1 :(得分:3)
df['global_id'] = df.pedestrian_id.ne(df.pedestrian_id.shift()).cumsum()
print(df)
seq_name label pedestrian_id frame_no global_id
0 1 crossing 1 0001.png 1
1 1 crossing 1 0002.png 1
2 1 crossing 1 0003.png 1
3 1 crossing 1 0004.png 1
4 1 crossing 1 0005.png 1
5 1 crossing 1 0006.png 1
6 1 crossing 1 0007.png 1
7 1 crossing 1 0008.png 1
8 1 crossing 1 0009.png 1
9 1 crossing 1 0010.png 1
10 1 crossing 2 0001.png 2
11 1 crossing 2 0002.png 2
12 1 crossing 2 0003.png 2
13 1 crossing 2 0004.png 2
14 1 crossing 2 0005.png 2
15 1 crossing 2 0006.png 2
16 1 crossing 2 0007.png 2
17 1 crossing 2 0008.png 2
18 1 crossing 2 0009.png 2
19 1 crossing 2 0010.png 2
20 2 crossing 1 0001.png 3
21 2 crossing 1 0002.png 3
22 2 crossing 1 0003.png 3
23 2 crossing 1 0004.png 3
24 2 crossing 1 0005.png 3
25 2 crossing 1 0006.png 3
26 2 crossing 1 0007.png 3
27 2 crossing 1 0008.png 3
28 2 crossing 1 0009.png 3
29 2 crossing 1 0010.png 3