Панды - групповой на конкатенации 2 столбцов - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть датафрейм ниже, где seq_name - это имя видео, pedestrian_id - это имя пешехода в этом видео, а frame_no - это кадры, которые содержат этого пешехода в видео. Таким образом, для примера ниже, у меня есть 2 видео 0001 и 0002 и 3 всего пешехода.

Я пытаюсь сгруппировать их, чтобы присвоить им global_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 перед добавлением нового столбца. Но когда я печатал данные, они больше не выглядели так, как показано выше, а также выглядели так, будто global_id был добавлен в новую строку вместо нового столбца. Хотелось бы помочь.

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Используйте ne с shift и cumsum:

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
0 голосов
/ 12 ноября 2018

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...