盤點(diǎn)一個Pandas數(shù)據(jù)處理基礎(chǔ)題目(文末有學(xué)習(xí)彩蛋)
回復(fù)“資源”即可獲贈Python學(xué)習(xí)資料
大家好,我是皮皮。
一、前言
前幾天在Python最強(qiáng)王者交流群【Chloe】問了一道Pandas處理的問題,如下圖所示。

原始數(shù)據(jù)如下:
df = pd.DataFrame( {'id' : ['A','A','A','A','A','A','B','B','B','B','B'],
'type' : [1,1,1,1,2,2,1,1,1,2,2],
'book' : ['Math','Math','English','Physics','Math','English','Physics','English','Physics','English','English']})
res = df.groupby(['id','type']).book.apply(list).reset_index()
res['book'] = res.apply(lambda x:(','.join([str(i) for i in x['book']])))
res
預(yù)期的結(jié)果如下圖所示:

二、實(shí)現(xiàn)過程
方法一
這里【月神】給出一個可行的代碼,大家后面遇到了,可以對應(yīng)的修改下,事半功倍,代碼如下所示:
df.groupby(['id','type']).book.unique().str.join(',').reset_index()
運(yùn)行之后,結(jié)果就是想要的了。

方法二
后來【瑜亮老師】也給了一份代碼。

代碼如下所示:
res = df.groupby(['id', 'type']).book.apply(set).reset_index()
res['book'] = res['book'].apply(lambda x: (','.join(x)))
print(res)
運(yùn)行之后,結(jié)果就是想要的了。

完美地解決了粉絲的問題!
最后再給大家分享一個知識點(diǎn),如下圖所示。

后來【瑜亮老師】還補(bǔ)充了一個結(jié)論,這里和大家一起分享下。
文章做了對比:
普通apply處理需要18秒左右,
使用Swift進(jìn)行加速提升到7秒左右,
函數(shù)向量化,時(shí)間縮短至0.4秒,
int64轉(zhuǎn)為int16,用時(shí)縮短至0.1秒
盡可能轉(zhuǎn)換為.values,再操作,僅用時(shí)0.07秒!!!
從18秒到0.07秒……

三、總結(jié)
大家好,我是皮皮。這篇文章主要盤點(diǎn)了一道使用Pandas處理數(shù)據(jù)的問題,文中針對該問題給出了具體的解析和代碼實(shí)現(xiàn),一共兩個方法,幫助粉絲順利解決了問題。
最后感謝粉絲【Chloe】提問,感謝【月神】、【瑜亮老師】給出的思路和代碼解析,感謝【dcpeng】、【馮誠】、【冷喵】、【D I Y】等人參與學(xué)習(xí)交流。
小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
------------------- End -------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請?jiān)诤笈_回復(fù)【入群】
萬水千山總是情,點(diǎn)個【在看】行不行
