数据分析面试题之Pandas中的groupby
昨天晚上,笔者有幸参加了一场面试,有一个环节就是现场编程!题目如下:
示例数据如下,求每名学生(ID)对应的成绩(score)最高的那门科目(class)与ID,用Python实现:
这个题目看上去很简单,其实,并不简单。即要求输出形式如下:
当然,我们一开始能先到的是利用Pandas中的groupby,按ID做groupby,按score取最大值,可是之后的过程就难办了,是将得到的结果与原表做join,还是再想其他办法?
怎么办?答案就是Pandas中groupby的官方文档说明,网址为:http://pandas.pydata.org/pand...。 截图如下:
本文将会用到其中的三个函数: 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
然后按需要取出数据即可。
本次分享到此结束,欢迎大家交流~~
注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~