熊猫-通过2列串联的groupby

时间:2018-11-12 11:36:46

标签: python pandas

我下面有一个数据框,其中seq_name是视频的名称,pedestrian_id是该视频中行人的名称,frame_no是在视频中包含该行人的帧视频。因此,对于以下示例,我有2个视频00010002,共有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_namepedestrian_id对它们进行分组。但是,当我打印数据时,它看起来不再类似于上面的ID,而且看起来global_id已附加到新行而不是新列。需要帮助。

df = df.groupby(['seq_name','pedestrian_id']).agg(lambda x: x.tolist())
df["global_id"] = range(1, len(df)+1)

2 个答案:

答案 0 :(得分:3)

使用GroupBy.ngroup

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)

neshiftcumsum结合使用:

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