Вы можете создать динамический словарь с помощью dict.fromkeys
с лямбда-функцией для всех столбцов без id
и ключей из словаря d1
и перейти к GroupBy.agg
:
f = lambda x: '/'.join(x.dropna().astype(str))
d1 = {'type':'last', 'name':'last'}
d2 = dict.fromkeys(df.columns.difference(['id'] + list(d1.keys())), f)
d = {**d1, **d2}
df = df.groupby('id', sort=False, as_index=False).agg(d)
print (df)
id type name comments description number
0 1 full A/B/C xxx/yyy XX/YY 2.0/4.0
1 2 full E/F/G/H zzz/www ZZ/WW 9.0/7.0
При необходимости обрабатывает значения в лямбда-функции по типам - например, сумма числовых и объединение нечисловыми столбцами:
f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else '/'.join(x.dropna())
d1 = {'type':'last', 'name':'last'}
d2 = dict.fromkeys(df.columns.difference(['id'] + list(d1.keys())), f)
d = {**d1, **d2}
df = df.groupby('id', sort=False, as_index=False).agg(d)
print (df)
id type name comments description number
0 1 full A/B/C xxx/yyy XX/YY 6.0
1 2 full E/F/G/H zzz/www ZZ/WW 16.0