如何在Pandas中实现类SQL的ROW_NUMBER窗口函数?
解决Pandas实现SQL窗口函数取最新记录的问题
首先需要注意:原数据中的date列是字符串格式,必须先转换为datetime类型,否则排序会出错。
方法一:排序+分组取首行(简洁高效)
先按org_id分组,每个组内按date降序排列,然后取每个组的第一行,最后筛选需要的列:
import pandas as pd # 构造示例数据 data = { 'org_id': [111, 222, 333, 111, 111, 222, 333, 222, 333], 'org_name': ['Microsoft', 'Zebra', 'Company', 'Microsoft', 'Microsoft Inc', 'Zebra', 'Company', 'NewZebra', 'Company'], 'person_id': ['453241', '21341', '42343241', '098678', '6786', '546', 'vcxv313', '876', '432gf'], 'date': ['1/1/05', '6/1/95', '1/1/23', '2/1/13', '6/1/23', '4/1/06', '2/1/23', '4/1/23', '4/1/23'] } df = pd.DataFrame(data) # 转换日期格式 df['date'] = pd.to_datetime(df['date']) # 核心操作:排序→分组取首行→选列 result = df.sort_values(['org_id', 'date'], ascending=[True, False]) \ .groupby('org_id') \ .head(1) \ [['org_id', 'org_name']] print(result)
输出结果:
org_id org_name 4 111 Microsoft Inc 7 222 NewZebra 8 333 Company
方法二:模拟SQL窗口函数(贴近原SQL逻辑)
如果想完全对应SQL中的ROW_NUMBER() OVER(PARTITION BY org_id ORDER BY date DESC)逻辑,可以用分组后给行编号的方式:
# 先按org_id和date降序排序 df_sorted = df.sort_values(['org_id', 'date'], ascending=[True, False]) # 给每个org_id分组内的行从1开始编号 df_sorted['row_num'] = df_sorted.groupby('org_id').cumcount() + 1 # 筛选行号为1的记录,再选需要的列 result = df_sorted[df_sorted['row_num'] == 1][['org_id', 'org_name']]
为什么直接用groupby聚合函数会有问题?
如果尝试用groupby('org_id').agg({'date': 'max', 'org_name': 'first'}),这种方式不可靠:因为max(date)对应的org_name不一定和first()取到的是同一行数据,会导致结果错误。必须先确保每个组内按日期排序后,再取对应行的org_name,这也是上面两种方法的核心逻辑。
内容的提问来源于stack exchange,提问作者simplycoding
相关产品推荐
相关产品推荐

