当前位置: 首页 > news >正文

力扣30 天 Pandas 挑战(3)---数据操作

本文围绕力扣的Pandas简单题集,解析如何用Pandas完成基础数据处理任务,适合Pandas初学者学习。

题目1:177. 第N高的薪水

题目描述:

表: Employee

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是该表的主键(列中的值互不相同)。该表的每一行都包含有关员工工资的信息。

编写一个解决方案查询 Employee 表中第 n 高的 不同 工资。如果少于 n 个不同工资,查询结果应该为 null 。

查询结果格式如下所示。

示例 :

输入: 
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
n = 2
输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+


解题思路:

1.将表中数据按salary列删去重复行并降序排列,题目要求第n高薪水即对应n-1索引行。

2.判断n是否为有效数据,即n是否大于0,表中是否有足够n行的数据。

题目代码:

import pandas as pddef nth_highest_salary(employee: pd.DataFrame, N: int) -> pd.DataFrame:# 处理无效的N(小于1)if N < 1:col_name = f'getNthHighestSalary({N})'return pd.DataFrame({col_name: [None]})# 获取唯一工资并降序排序unique_salaries = employee['salary'].drop_duplicates().sort_values(ascending=False)# 检查是否有足够的n行数据if len(unique_salaries) < N:col_name = f'getNthHighestSalary({N})'return pd.DataFrame({col_name: [None]})# 获取第N高的工资(索引从0开始)nth_salary = unique_salaries.iloc[N-1]col_name = f'getNthHighestSalary({N})'return pd.DataFrame({col_name: [nth_salary]})

题目2:176. 第二高的薪水

题目描述:

Employee 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。

查询并返回 Employee 表中第二高的 不同 薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。


解题思路:

与题目1:177. 第N高的薪水类似,重复值删去并降序排列之后,返回固定2行的数据,若不足2行,返回空。

题目代码:

import pandas as pddef second_highest_salary(employee: pd.DataFrame) -> pd.DataFrame:# 获取工资并降序排序unique_salaries = employee['salary'].drop_duplicates().sort_values(ascending=False)# 判断是否有2行if len(unique_salaries) < 2:return pd.DataFrame({'SecondHighestSalary': [None]})# 获取第二高的工资(索引从0开始)second_salary = unique_salaries.iloc[1]return pd.DataFrame({'SecondHighestSalary': [second_salary]})

题目3:184. 部门工资最高的员工

题目描述:

表: Employee

+--------------+---------+
| 列名          | 类型    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
在 SQL 中,id是此表的主键。
departmentId 是 Department 表中 id 的外键(在 Pandas 中称为 join key)。
此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。

表: Department

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
在 SQL 中,id 是此表的主键列。
此表的每一行都表示一个部门的 id 及其名称。

查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。


解题思路:

找出每个部门的最高薪资,再在表中筛选薪资等于部门最高薪资的行,重命名列名并作为返回值返回。

题目代码:

import pandas as pddef department_highest_salary(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame:merged = pd.merge(employee, department, left_on='departmentId', right_on='id', how='left')#找出每个部门的最高薪资max_salaries = merged.groupby('name_y')['salary'].max().reset_index()max_salaries.columns = ['Department', 'MaxSalary']#筛选出薪资等于部门最高薪资的员工result = pd.merge(merged, max_salaries, left_on=['name_y', 'salary'], right_on=['Department', 'MaxSalary'])result = result[['name_y', 'name_x', 'salary']]result.columns = ['Department', 'Employee', 'Salary']return result

题目4:178. 分数排名

题目描述:

表: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
id 是该表的主键(有不同值的列)。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。

编写一个解决方案来查询分数的排名。排名按以下规则计算:

分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。按 score 降序返回结果表。

解题思路:

将表按成绩降序排列,再使用dense_rank()方法,dense_rank() 是一个窗口函数,用于为结果集中的行分配排名,其中相同值的行获得相同的排名,并且排名是连续的(没有间隔)。

题目代码:

import pandas as pddef order_scores(scores: pd.DataFrame) -> pd.DataFrame:# 按分数降序排序sorted_scores = scores.sort_values(by='score', ascending=False)# 使用dense_rank方法sorted_scores['rank'] = sorted_scores['score'].rank(method='dense', ascending=False).astype(int)return sorted_scores[['score', 'rank']]

题目5:196. 删除重复的电子邮箱

题目描述:

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id 的唯一电子邮件。

(对于 SQL 用户,请注意你应该编写一个 DELETE 语句而不是 SELECT 语句。)

(对于 Pandas 用户,请注意你应该直接修改 Person 表。)

运行脚本后,显示的答案是 Person 表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person 表。Person 表的最终顺序 无关紧要 。


解题思路:

将表中数据按id升序排列,再使用drop_duplicates方法只保留首个重复行,删去其他重复行。

题目代码:

import pandas as pddef delete_duplicate_emails(person: pd.DataFrame) -> None:#按id升序排列person.sort_values('id', inplace=True)#使用drop_duplicates()方法保留重复的首行数据person.drop_duplicates(subset='email', keep='first', inplace=True)

题目6:1795. 每个产品在不同商店的价格

题目描述:

表:Products

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_id  | int     |
| store1      | int     |
| store2      | int     |
| store3      | int     |
+-------------+---------+
在 SQL 中,这张表的主键是 product_id(产品Id)。
每行存储了这一产品在不同商店 store1, store2, store3 的价格。
如果这一产品在商店里没有出售,则值将为 null。

请你重构 Products 表,查询每个产品在不同商店的价格,使得输出的格式变为(product_id, store, price) 。如果这一产品在商店里没有出售,则不输出这一行。

输出结果表中的 顺序不作要求 。


解题思路:

使用melt()函数将宽格式转换为长格式,再删除价格为空的行。

题目代码:

import pandas as pddef rearrange_products_table(products: pd.DataFrame) -> pd.DataFrame:result = products.melt(id_vars=['product_id'],var_name='store',value_name='price')result = result.dropna(subset=['price']) return result
http://www.dtcms.com/a/303760.html

相关文章:

  • LeetCode 283 - 移动零
  • CTF-Web学习笔记:服务端请求伪造(SSRF)篇
  • 单片机学习笔记.PWM
  • 第4章唯一ID生成器——4.5 美团点评开源方案Leaf
  • 医疗AI新基建:MCP与A2A协议的破局与前瞻
  • JVM 崩溃(Fatal Error)解决方法
  • 影刀RPA_初级课程_玩转影刀自动化_EXCEL操作自动化
  • 《C++初阶之STL》【list容器:详解 + 实现】
  • JSON解析
  • Spring IOC 基于Cglib实现含构造函数的类实例化策略
  • 循环神经网络——动手学深度学习7
  • 板凳-------Mysql cookbook学习 (十二--------7)
  • SpringBoot 的@Repository 等注解的底层实现原理
  • 智能体安全与可信AI:防护机制与伦理考量
  • SpringBoot之起步依赖
  • 【使用python中列表注意事项】
  • Windows使用Powershell自动安装SqlServer2025服务器与SSMS管理工具
  • 【自存用】mumu模拟器+mitmproxy配置
  • ADSP-21565的SigmaStudio图形化编程详解
  • Linux 完整删除 Systemd 服务的步骤
  • 递归、搜索与回溯算法核心思想解析
  • Agent常用搜索引擎Tavily使用学习
  • linux中简易云盘系统项目实战:基于 TCP协议的 Socket 通信、json数据交换、MD5文件区别与多用户文件管理实现
  • 配置daemon.json使得 Docker 容器能够使用服务器GPU【验证成功】
  • 界面控件Telerik UI for WPF 2025 Q2亮点 - 重要组件全新升级
  • 「源力觉醒 创作者计划」_文心大模型 4.5 多模态实测:开源加速 AI 普惠落地
  • VUE -- 基础知识讲解(一)
  • 从字符串中“薅出”最长子串:LeetCode 340 Swift 解法全解析
  • 分布式链路追踪详解
  • 如何用USRP捕获手机信号波形(中)手机/基站通信