You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:25:28