问题说明:
前几天在Python最强王者交流群【群除我佬】问了一个Pandas
处理的问题,这里拿出来给大家分享下。
看上去不太好理解,其实说白了,就是在工资最高里,再找时间最早的。
换句话说就是,这三个人,每个人找工资最高,然后在这个范围里找时间最早 就是他的调薪时间。
解决方法:
这里我们提供一种解决方案:
import pandas as pd
data = {'name': ['陈六', '吴三', '吴三', '陈六', '钱十', '陈六', '吴五', '吴五', '陈六', '吴八', '钱十', '陈六'],
'date': ['2024-01-04', '2024-01-13', '2024-01-29', '2024-01-12', '2024-01-20', '2024-01-19', '2024-01-27',
'2024-01-20', '2024-01-09', '2024-01-08', '2024-01-14', '2024-01-28'],
'salary': [6026, 5352, 5791, 9567, 9728, 6160, 9015, 9508, 9253, 9570, 8690, 7395]}
df = pd.DataFrame(data)
print(df.sort_values(['name', 'salary', 'date'], ascending=[True, False, True]).groupby(['name']).head(1))
结果展示:
代码说明:
print(df.sort_values(['name', 'salary', 'date'], ascending=[True, False, True])
- 排序 DataFrame:
df.sort_values([...])
: 对 DataFramedf
进行排序。['name', 'salary', 'date']
: 表示按name
、salary
和date
三列进行排序。ascending=[True, False, True]
:- 对
name
列进行升序排列(即 A 到 Z)。 - 对
salary
列进行降序排列(即从高到低)。 - 对
date
列进行升序排列(即从早到晚)。
- 对
经过这一步,DataFrame 将首先按姓名升序排列,在同一姓名下,按薪资降序排列;如果薪资相同,则按日期升序排列。
.groupby(['name']).head(1)
- 分组并选取第一条记录:
.groupby(['name'])
: 根据name
列将 DataFrame 分组,这会将具有相同名字的行聚集在一起。.head(1)
: 从每个分组中提取前一行。由于之前已经按薪资降序排列,因此每个姓名组的第一行将是该姓名下薪资最高的记录。
- 打印结果: 最终代码会输出一个 DataFrame,其中每个员工姓名只会保留薪资最高的一条记录,若有多个相同薪资,则选择日期最早的记录。
概要总结:
- 这段代码的主要目的是从 DataFrame 中提取每个员工薪资最高且在先的记录。
- 首先按姓名和薪资进行排序,然后分组并获取每个员工的最高薪资记录。