前因

想要把下面 dataframe , 分類後合併在一起

    order   devie abbr
0   first  memory    m
1  second     cpu    c
2   third    disk    d
3   first     cpu    c

成為下面的 data format

    order        devie    abbr
0   first  memory, cpu  [m, c]
1  second          cpu     [c]
2   third         disk     [d]

先建立兩個 lambda 變數

​ f1 的功用是將 dataframe 轉換成字串, f2 則將 dataframe 轉換成 list

>>>f1 = lambda x: ", ".join(x.dropna())
>>>f1(data.abbr)
'm, c, d, c'
>>>f2 = lambda x: [z for y in x for z in y]
>>>f2(data.abbr)
['m', 'c', 'd', 'c']

​ 將上述的 lambda 儲存在一個 dict 變數中, 分別對應 dataframe 各個欄位

待會會套用在 agg function 上

>>> d = dict.fromkeys(data.columns.difference(['order', 'abbr']), f1)
>>> d['abbr'] = f2
>>> d
{'devie': <function <lambda> at 0x7fa4b9105400>, 'abbr': <function <lambda> at 0x7fa4a23117b8>}

使用 groupby 和 agg

​ 最後把上述產生的 d 變數, 套用到 agg function 就產生想要的資料了

>>> df = data.groupby('order', as_index=False).agg(d)
>>> df
    order        devie    abbr
0   first  memory, cpu  [m, c]
1  second          cpu     [c]
2   third         disk     [d]

reference

stackoverflow question 54944344