Используйте GroupBy.agg
с первым столбцом и ffill
для прямого заполнения пропущенных значений и словаря, который создается динамически - для каждого столбца без date
и items
применяется агрегатная функция GroupBy.first
и для последнего столбца items
используется join
с удаленными пропущенными значениями:
d = dict.fromkeys(df.columns.difference(['date','items']), 'first')
d['items'] = lambda x: ', '.join(x.dropna())
df = df.groupby(df['date'].ffill()).agg(d).reset_index()
print (df)
date name values items
0 01-03-2019 xyz 900 brush
1 02-03-2019 abc 1200 paste, floss
Если возможно только несколько столбцов, передайте 2 столбца в groupby
с помощью ffill
и создайте словарь, переданный в agg
:
df = (df.groupby([df['date'].ffill(), df['name'].ffill()])
.agg({'values':'first', 'items':lambda x: ', '.join(x.dropna())})
.reset_index())
print (df)
date name values items
0 01-03-2019 xyz 900 brush
1 02-03-2019 abc 1200 paste, floss