Динамически создавать словарь по всем столбцам без list
и value_1
, а для list
использовать лямбда-функцию с пониманием списка с использованием флейтеннинга:
f1 = lambda x: ', '.join(x.dropna())
#alternative for join only strings
#f1 = lambda x: ', '.join([y for y in x if isinstance(y, str)])
f2 = lambda x: [z for y in x for z in y]
d = dict.fromkeys(df.columns.difference(['value_1','list']), f1)
d['list'] = f2
df = df.groupby('value_1', as_index=False).agg(d)
print (df)
value_1 value_2 value_3 \
0 american california, nyc, texas walmart, kmart
1 canadian toronto dunkinDonuts, walmart
list
0 [supermarket, connivence, state]
1 [coffee, supermarket]
Объяснение :
f1
и f2
являются лямбда-функциями.
Сначала удалите пропущенные значения (если есть) и join
строки с разделителем:
f1 = lambda x: ', '.join(x.dropna())
Сначала получите толькостроковые значения (пропустите пропущенные значения, потому что NaN
s) и join
строки с разделителем:
f1 = lambda x: ', '.join([y for y in x if isinstance(y, str)])
Сначала получите все строковые значения с фильтрацией пустых строк и join
строки с разделителем:
f1 = lambda x: ', '.join([y for y in x if y != ''])
Функция f2
предназначена для сглаживания списков , поскольку после агрегирования получают вложенные списки, такие как [['a','b'], ['c']]
f2 = lambda x: [z for y in x for z in y]