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

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

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

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试官问到关于pandas的问时,通常会涉及以下几个方面: 1. 什么是pandasPandas是一个开源的Python库,用于数据分析和数据处理。它提供了高效的数据结构和数据分析工具,使得数据处理变得简单且高效。 2. Pandas的主要数据结构有哪些? Pandas的两个主要数据结构是Series和DataFrame。Series是一维标记数组,类似于带有标签的数组。DataFrame是二维表格,类似于关系型数据库的表。 3. 如何创建一个Series和一个DataFrame? 可以使用pandas的构造函数来创建Series和DataFrame。例如,可以使用`pd.Series(data, index)`来创建一个Series,其data是数据,index是索引。使用`pd.DataFrame(data, columns)`来创建一个DataFrame,其data是数据,columns是列名。 4. 如何读取和写入数据? Pandas提供了多种方法来读取和写入数据,常用的方法包括`pd.read_csv()`用于读取CSV文件,`pd.read_excel()`用于读取Excel文件,`df.to_csv()`用于将DataFrame写入CSV文件等。 5. 如何选择和过滤数据? 可以使用pandas提供的方法来选择和过滤数据。例如,可以使用`df['column_name']`选择某一列的数据,使用`df.loc[row_indexer, column_indexer]`选择特定行和列的数据。 6. 如何处理缺失值? Pandas提供了多种方法来处理缺失值,例如使用`df.dropna()`删除包含缺失值的行或列,使用`df.fillna(value)`将缺失值填充为指定的值。 7. 如何进行数据排序和分组? 可以使用`df.sort_values()`对数据进行排序,使用`df.groupby()`对数据进行分组。排序可以按照指定的列进行,分组可以按照指定的列进行。 8. 如何进行数据统计和计算? Pandas提供了丰富的统计和计算方法,例如`df.describe()`可以计算数据的基本统计信息,`df.mean()`可以计算平均值,`df.sum()`可以计算总和等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值