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

news/2024/7/19 9:22:43 标签: 面试, python, 爬虫

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

score.csv

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

输出结果

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

pandas中groupby的官方说明

本文将会用到其中的三个函数: idxmax(), idxmin(), rank().
  其实,让我们来解决一开始提出的问题,Python代码如下:

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代码如下:

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), 欢迎大家关注哦~~


http://www.niftyadmin.cn/n/682161.html

相关文章

mycat可以干什么

 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换 分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片 多租户应用,每个应用一个库,但应用程序只连接 Mycat&…

Oracle字符集与字符类型存储空间占用

今天看到了乐大师新篇后,自己实验了一把 Oracle字符集与字符类型存储空间占用http://blog.csdn.net/leshami/article/details/51416387 使用XMANGER XSHELL 连接到LINUX客户端工具 设置格式为UTF-8设置LINUX客户端语言环境 LANG是系统环境,NLS_LANG是数据库客户端环境开另外个…

Python多线程分片下载远端大文件 - threading paramiko

Python多xian程分片下载远端大文件 ,可以按照以下流程设计代码框架: 导入需要的模块:首先,导入所需的模块,包括paramiko、os、time和threading。 创建下载函数:创建一个用于分片下载文件的函数。该函数将使…

vue 数组 新增元素 响应式原理 7种方法

1、问题 思考一个问题&#xff0c;以下代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>vue 数组 响应式原理</title></head><body><div id"app"><div v-for"…

SQL Tuning Advisor 使用11G的自动调优建议

先给监控用户授权grant advisor to DBA_MONITER; 可以在PL/SQL DEVELOPER 命令窗口执行SQL_ID方式 DECLAREmy_task_name VARCHAR2(30); BEGINmy_task_name :DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id > 8gb2jup02tzt3, scope > COMPREHENSIVE, time_li…

linux命令(用户)

一.常用命令 1.1 ls ls 命令是 linux 下最常用的命令&#xff0c;ls 命令就是 list 的缩写。 ls 用来打印出当前目录的清单。如果 ls 指定其他目录&#xff0c;那么就会显示指定目录里的文件及文件夹清单。 通过 ls 命令不仅可以查看 linux 文件夹包含的文件&#xff0c;而且可…

JAVA CLOB作为参数传给ORACLE后台

工作中遇到了个小问题,有这样的SQL SELECT * FROM STUDENS WHERE ID IN (:1,:2,:3,.....:1000); 这里面的参数个数是动态变化的, 由用户界面上不同的选择后的数据进行批量处理. 比如说选择英语低于60分的去进行校外劳动. 学校的学生最大数量为1000. 同时ORACLE IN 也最大…

GIT合并版本步骤

注意事项&#xff1a;合并涉及的两个分支&#xff0c;必须保证是最新版本示例1&#xff1a;将MASTER同步到3.3&#xff0c;切换到MASTER&#xff0c;PULL最新&#xff0c;再切换到3.3&#xff0c;PULL最新&#xff0c;然后选择MASTER->MERGE&#xff0c;将MASTER同步到3.3&a…