У меня есть 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
Замените сопоставленные значения на отсутствующие значения по 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'
Это будет работать:
df = df.sort_values(['id'])
.groupby('id', sort=False).details
.apply(''.join)
df.groupby('id').agg({'details':' '.join,'indexID':'first'}).reset_index()
не используяdf2
но не уверены почему ОП хочет использовать df2.df2
по моему мнению.