Объедините определенные строки в фрейме данных и удалите неиспользуемые строки - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть фрейм данных с именем df1, который выглядит следующим образом:

details            endFrame id  indexID object  startFrame
'series of numbers’  1111   78  0   Motorbike   1
'series of numbers’  3647   78  1   Motorbike   1112
'series of numbers’  3678   78  2   Motorbike   3649
'series of numbers’  704    120 3   Pedestrian  66
'series of numbers’  817    120 4   Pedestrian  705
'series of numbers’  922    120 5   Pedestrian  818
'series of numbers’  121    110 6   Pedestrian  69
'series of numbers’  140    109 7   Pedestrian  69
'series of numbers’  4161   109 8   Pedestrian  140
'series of numbers’  4344   109 9   Pedestrian  4163
'series of numbers’  3603   79  10  Motorbike   70

И у меня есть еще один df2, который выглядит следующим образом:

indexID matchID
0   1
1   2
3   4
4   5
7   8
8   9

Идентификатор соответствия показывает, какие идентификаторы нужныбыть присоединенным.Например, из первых 2 строк индексы 0,1 и 2 должны быть соединены вместе.В df1 все детали должны быть просто сложены вместе.Окончательный финальный df должен выглядеть следующим образом:

details                                                       id    indexID
'series of numbers’'series of numbers’'series of numbers’     78    0
'series of numbers’'series of numbers’'series of numbers’     120   3
'series of numbers’                                           110   6
'series of numbers’'series of numbers’'series of numbers’     109   7
'series of numbers’                                            79   10

Как мне это сделать?

РЕДАКТИРОВАТЬ Последовательность чисел на самом деле представляет собой список, поэтому вместовывод такой:

details                                                  id    indexID
[series of numbers][series of numbers][series of numbers]     78    0
[series of numbers][series of numbers][series of numbers]     120   3
[series of numbers]                                           110   6
[series of numbers][series of numbers][series of numbers]     109   7
[series of numbers]                                            79   10

Я бы хотел, чтобы он выглядел так:

details                                                  id    indexID
[series of numbersseries of numbersseries of numbers]     78    0
[series of numbersseries of numbersseries of numbers]     120   3
[series of numbers]                                           110   6
[series of numbersseries of numbersseries of numbers]     109   7
[series of numbers]                                            79   10

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Заменить сопоставленные значения на пропущенные значения на mask на isin и выполнить прямое заполнение предыдущими значениями:

g = df1['indexID'] .mask(df1['indexID'].isin(df2['matchID'])).ffill().astype(int)
print (g)
0      0
1      0
2      0
3      3
4      3
5      3
6      6
7      7
8      7
9      7
10    10
Name: indexID, dtype: int32

Затем использовать groupbyс join:

#if want grouping only be new Series g
df = df1.groupby(g).agg({'details':' '.join, 'id':'first'}).reset_index()
print (df)
   indexID                                            details   id
0        0  'series of numbers' 'series of numbers' 'serie...   78
1        3  'series of numbers' 'series of numbers' 'serie...  120
2        6                                'series of numbers'  110
3        7  'series of numbers' 'series of numbers' 'serie...  109
4       10                                'series of numbers'   79

#or also by id column
df = df1.groupby(['id',g], sort=False)['details'].agg(' '.join).reset_index()
print (df)
    id  indexID                                            details
0   78        0  'series of numbers' 'series of numbers' 'serie...
1  120        3  'series of numbers' 'series of numbers' 'serie...
2  110        6                                'series of numbers'
3  109        7  'series of numbers' 'series of numbers' 'serie...
4   79       10                                'series of numbers'
0 голосов
/ 21 сентября 2018

Это будет работать:

df = df.sort_values(['id'])
       .groupby('id', sort=False).details
       .apply(''.join)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...