Объедините определенные строки в фрейме данных и удалите неиспользуемые строки

1

У меня есть dataframe, называемый 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

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

EDIT Серия чисел на самом деле является списком, поэтому вместо вывода такого типа:

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
Теги:
database
pandas
dataframe
python-2.7

2 ответа

2
Лучший ответ

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

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 with 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
    На самом деле, мы можем получить желаемый результат напрямую, используя df.groupby('id').agg({'details':' '.join,'indexID':'first'}).reset_index() не используя df2 но не уверены почему ОП хочет использовать df2.
  • 0
    @SandeepKadapa - я думаю, что OP хочет использовать df2 по моему мнению.
Показать ещё 11 комментариев
0

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

df = df.sort_values(['id'])
       .groupby('id', sort=False).details
       .apply(''.join)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню