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

作者: 山阴少年 | 来源:发表于2018-11-20 11:18 被阅读2次

      昨天晚上,笔者有幸参加了一场面试,有一个环节就是现场编程!题目如下:
      示例数据如下,求每名学生(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
    

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

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

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

    相关文章

      网友评论

        本文标题:数据分析面试题之Pandas中的groupby

        本文链接:https://www.haomeiwen.com/subject/fistqqtx.html