Используйте DataFrame.sort_values
перед groupby
и, если нужен тот же порядок, что и оригинал, по столбцу data
, добавьте DataFrame.reindex
по уникальным значениям, созданным Series.unique
:
df1 = (df.sort_values(['data','order'])
.groupby('data')['section']
.agg(','.join)
.reindex(df['data'].unique())
.reset_index())
print (df1)
data section
0 google code,reason,allergy,advance,service
1 Microsoft ab,ef,cd,gf
Если возможно, данные объединяются с помощью ,
сначала сортируются данные, а затем для уникальных значений используется словарь, поскольку наборы не имеют определенного порядка:
print (df)
data section order
0 google code, code 1
1 google allergy 3
2 google reason 2
3 google service 5
4 google advance 4
5 Microsoft ab, ab, kl 1
6 Microsoft eh, eh, cd 3
7 Microsoft ef 2
8 Microsoft gf 4
df1 = df.sort_values(['data','order'])
data= (df1['section'].str.split(', ')
.groupby(df['data'])
.agg(lambda x: ', '.join(dict.fromkeys(y for z in x for y in z).keys()))
.reindex(df['data'].unique())
.reset_index()
)
print (data)
data section
0 google code, reason, allergy, advance, service
1 Microsoft ab, kl, ef, eh, cd, gf
Альтернатива для удаления дубликатов на DataFrame.explode
на DataFrame.drop_duplicates
:
df1 = df.sort_values(['data','order'])
data= (df1.assign(section= df1['section'].str.split(', '))
.explode('section')
.drop_duplicates(['data', 'section','order'])
.groupby('data')['section']
.agg(', '.join)
.reindex(df['data'].unique())
.reset_index()
)
print (data)
data section
0 google code, reason, allergy, advance, service
1 Microsoft ab, kl, ef, eh, cd, gf