資料分析面試題之Pandas中的groupby
阿新 • • 發佈:2018-11-20
昨天晚上,筆者有幸參加了一場面試,有一個環節就是現場程式設計!題目如下:
示例資料如下,求每名學生(ID)對應的成績(score)最高的那門科目(class)與ID,用Python實現:
這個題目看上去很簡單,其實,並不簡單。即要求輸出形式如下:
當然,我們一開始能先到的是利用Pandas中的groupby,按ID做groupby,按score取最大值,可是之後的過程就難辦了,是將得到的結果與原表做join,還是再想其他辦法?
怎麼辦?答案就是Pandas中groupby的官方文件說明,網址為:http://pandas.pydata.org/pandas-docs/stable/api.html#groupby。
本文將會用到其中的三個函式: idxmax(), idxmin(), rank().
其實,讓我們來解決一開始提出的問題,Python程式碼如下:
import pandas as pd
df = pd.read_csv("E://score.csv")
new_df = df.groupby("ID")["score"].idxmax()
for i in new_df:
print(df.iloc[i, :].tolist()[0:2])
分析程式碼,df.groupby(“ID”)[“score”].idxmax()是對原資料按ID做groupby,然後取score列,用idxmax()取出成績最好的行。然後取出這些行即可。
當然,上述程式碼存在兩個衍生問題:
- 每名學生(ID)對應的成績(score)最低的那門科目(class)與ID;
- 若有學生他的某些科目的成績是一樣的,求每名學生對應的成績最高的那些科目與ID。
第一個問題,很好解決,在原先的程式碼中,將idxmax()替換為idxmin()即可,輸出的結果如下:
[1, 'C']
[2, 'A']
[3, 'C']
[4, 'A']
第二個問題,如果有學生他的某些科目的成績是一樣的,如下面的示例資料:
在上面資料中,第1,3名學生的最高成績存在重複。這是,我們需要用到rank()函式,Python程式碼如下:
import pandas as pd
import numpy as np
df = pd.read_csv("E://score.csv")
df["rank"] = df.groupby("ID")["score"].rank(method="min", ascending=False).astype(np.int64)
#print(df)
print(df[df["rank"] == 1][["ID", "class"]])
輸出結果如下:
ID class
0 1 A
1 1 B
5 2 C
7 3 B
8 3 C
11 4 C
可以看到,我們得到的df這個資料框添加了一列rank,就是每名學生的科目的成績排名,得到的df如下:
ID class score rank
0 1 A 90 1
1 1 B 90 1
2 1 C 70 3
3 2 A 60 3
4 2 B 80 2
5 2 C 100 1
6 3 A 90 3
7 3 B 100 1
8 3 C 100 1
9 4 A 70 3
10 4 B 80 2
11 4 C 90 1
然後按需要取出資料即可。
本次分享到此結束,歡迎大家交流~~