按姓名分组保留日期最新的角色记录技术问询
按分组保留最新日期记录的实现方案
需求:基于Date列筛选数据,按Name字段分组,保留每组中日期最新的角色记录。
示例数据:Name Date Role John 01/08/2023 A John 01/07/2023 B Steve 01/06/2023 B Steve 01/04/2023 A需保留第1行和第3行数据
SQL 实现
使用窗口函数ROW_NUMBER()对每组数据按日期倒序排名,筛选排名第一的记录即可:
WITH ranked_data AS ( SELECT Name, Date, Role, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY STR_TO_DATE(Date, '%d/%m/%Y') DESC) AS rn FROM your_table_name ) SELECT Name, Date, Role FROM ranked_data WHERE rn = 1;
STR_TO_DATE(Date, '%d/%m/%Y'):将字符串格式的日期转换为可排序的日期类型,确保排序逻辑正确;PARTITION BY Name:按姓名字段分组;ORDER BY ... DESC:让每组内最新的日期排在最前面;- 最后筛选
rn=1,得到每组日期最新的记录。
Python Pandas 实现
方法1:排序后分组取首行
先将日期列转为标准日期格式,按日期倒序排序后,分组取每组的第一条记录:
import pandas as pd # 构造示例数据 data = pd.DataFrame({ 'Name': ['John', 'John', 'Steve', 'Steve'], 'Date': ['01/08/2023', '01/07/2023', '01/06/2023', '01/04/2023'], 'Role': ['A', 'B', 'B', 'A'] }) # 转换日期格式 data['Date'] = pd.to_datetime(data['Date'], format='%d/%m/%Y') # 按日期倒序排序,分组后取每组第一条 result = data.sort_values('Date', ascending=False).groupby('Name').first().reset_index() print(result)
方法2:利用idxmax获取最大日期索引(高效版)
直接获取每组最大日期对应的行索引,再筛选数据,适合处理大数据量:
import pandas as pd # 构造并预处理数据(同方法1) data = pd.DataFrame({ 'Name': ['John', 'John', 'Steve', 'Steve'], 'Date': ['01/08/2023', '01/07/2023', '01/06/2023', '01/04/2023'], 'Role': ['A', 'B', 'B', 'A'] }) data['Date'] = pd.to_datetime(data['Date'], format='%d/%m/%Y') # 获取每组最大日期的行索引,筛选对应数据 max_date_indices = data.groupby('Name')['Date'].idxmax() result = data.loc[max_date_indices] print(result)
内容的提问来源于stack exchange,提问作者ad282189323213
相关产品推荐
相关产品推荐

