1. 程式人生 > >資料分析面試題之Pandas中的groupby

資料分析面試題之Pandas中的groupby

  昨天晚上,筆者有幸參加了一場面試,有一個環節就是現場程式設計!題目如下:
  示例資料如下,求每名學生(ID)對應的成績(score)最高的那門科目(class)與ID,用Python實現:

score.csv

這個題目看上去很簡單,其實,並不簡單。即要求輸出形式如下:

輸出結果

  當然,我們一開始能先到的是利用Pandas中的groupby,按ID做groupby,按score取最大值,可是之後的過程就難辦了,是將得到的結果與原表做join,還是再想其他辦法?
  怎麼辦?答案就是Pandas中groupby的官方文件說明,網址為:http://pandas.pydata.org/pandas-docs/stable/api.html#groupby。

截圖如下:

pandas中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()取出成績最好的行。然後取出這些行即可。
  當然,上述程式碼存在兩個衍生問題:

  1. 每名學生(ID)對應的成績(score)最低的那門科目(class)與ID;
  2. 若有學生他的某些科目的成績是一樣的,求每名學生對應的成績最高的那些科目與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

然後按需要取出資料即可。

  本次分享到此結束,歡迎大家交流~~