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

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

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

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

  • 相关阅读:
    Ubuntu 服务器默认的root账号是没有激活的,需要用初装的用户账号给root设置管理密码
    MySQL忘记root密码重置密码(5.7版本)
    SpringMvc与前台ajax数据传递
    将http://localhost:8080设置为项目主页
    javaweb项目主页设置
    Redis在java开发中使用
    eclipse基于git上传项目到码云上
    spring配置tomcat jdbc pool数据库连接池
    run as maven build时报错
    Tomcat-Jdbc-Pool连接池参数说明
  • 原文地址:https://www.cnblogs.com/jclian91/p/9987792.html
Copyright © 2020-2023  润新知