Pandas實(shí)例 - 怎樣計(jì)算每個(gè)學(xué)生成績(jī)最相似的10個(gè)學(xué)生
本文來自粉絲的一個(gè)需求,怎樣計(jì)算每個(gè)學(xué)生成績(jī)相近的10個(gè)學(xué)生?
需求

他的Excel表格是這個(gè)樣子:

包含每個(gè)學(xué)生的姓名,以及多個(gè)科目的成績(jī)。
怎么用Pandas實(shí)現(xiàn)呢?
解題思路
Pandas解題思路:
1、使用笛卡爾積的方式,得到 每個(gè)學(xué)生 和 另外所有學(xué)生的 關(guān)聯(lián)行
每個(gè)學(xué)生都要與其他所有行進(jìn)行交叉關(guān)聯(lián),比如有100個(gè)學(xué)生,那應(yīng)該得到100*100 = 1W行結(jié)果
2、對(duì)于關(guān)聯(lián)行,使用df.apply(function)的方法,計(jì)算兩兩相似度;
本步驟是為了計(jì)算每個(gè)學(xué)生和其他學(xué)生的 相似度
3、使用groupby + top n的方式,計(jì)算每個(gè)學(xué)生成績(jī)最相近的10個(gè)學(xué)生
步驟0:讀取數(shù)據(jù)

大家注意,這里的原始數(shù)據(jù)是60行;
步驟1:實(shí)現(xiàn)笛卡爾積
即實(shí)現(xiàn)每個(gè)學(xué)生與其他所有學(xué)生的關(guān)聯(lián)。這里的技巧,是先添加一個(gè)一模一樣的數(shù)字列,用此作為關(guān)聯(lián)列進(jìn)行merge即可

我們看到,這里的結(jié)果行數(shù)是3600,也就實(shí)現(xiàn)了60個(gè)學(xué)生的兩兩交叉。
步驟2:實(shí)現(xiàn)每個(gè)學(xué)生的相似度計(jì)算

大家注意這里的用法,df.apply,可以按行回調(diào)一個(gè)函數(shù)進(jìn)行處理

這里我多加了一步,把每個(gè)學(xué)生自己和自己關(guān)聯(lián)的行去掉。
步驟3:計(jì)算每個(gè)學(xué)生最相近的10個(gè)學(xué)生
其實(shí)就是實(shí)現(xiàn)group by + top n的效果

看下結(jié)果Excel文件
結(jié)果有3列,每個(gè)學(xué)生,以及他最相似的學(xué)生列表以及相似度值

視頻講解
代碼地址:
https://github.com/peiss/ant-learn-pandas
打開github后,第46集
如果本文對(duì)你有幫助,感謝點(diǎn)贊和再看^_^
