数据分析面试题之Pandas中的groupby

  昨天晚上,笔者有幸参加了一场面试,有一个环节就是现场编程!题目如下:
  示例数据如下,求每名学生(ID)对应的成绩(score)最高的那门科目(class)与ID,用Python实现:

数据分析面试题之Pandas中的groupby

这个题目看上去很简单,其实,并不简单。即要求输出形式如下:

数据分析面试题之Pandas中的groupby

  当然,我们一开始能先到的是利用Pandas中的groupby,按ID做groupby,按score取最大值,可是之后的过程就难办了,是将得到的结果与原表做join,还是再想其他办法?
  怎么办?答案就是Pandas中groupby的官方文档说明,网址为:http://pandas.pydata.org/pand...。 截图如下:

数据分析面试题之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']

  第二个问题,如果有学生他的某些科目的成绩是一样的,如下面的示例数据:

数据分析面试题之Pandas中的groupby

在上面数据中,第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

然后按需要取出数据即可。

  本次分享到此结束,欢迎大家交流~~

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

相关推荐