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

如何在Pandas中实现SQL的ROW_NUMBER() OVER(PARTITION BY (SELECT NULL))功能?

Pandas 实现 SQL 中 ROW_NUMBER() OVER(PARTITION BY (SELECT NULL)) 的等效方法

问题背景

现有名为Mapping的表,结构如下:

Mapping
+---------+---------+
| user_id | prod_id |
+---------+---------+
|     41  |  N12ad  |
|      2  |  nd5Ed  |
|     73  |  bDe4d  |
|     25  |  M87he  |
+---------+---------+

需要添加ranking列,按照数据在数据库中的存储顺序为行编号,最终效果如下:

+---------+---------+---------+
| user_id | prod_id | ranking |
+---------+---------+---------+
|     41  |  N12ad  |      1  |
|      9  |  nd5Ed  |      2  |
|     73  |  bDe4d  |      3  |
|     25  |  M87he  |      4  |
+---------+---------+---------+

在Microsoft SQL中,实现代码为:

SELECT user_id, prod_id, ROW_NUMBER() OVER(PARTITION BY (SELECT NULL)) AS ranking
FROM Mapping

请问在Pandas中,与之等效的实现方式是什么?


解决方案

在Pandas里,有几种简洁的方式实现全局连续行号生成,对应SQL中的ROW_NUMBER() OVER(PARTITION BY (SELECT NULL))逻辑:

方法1:利用reset_index()生成序号

如果DataFrame没有自定义索引,或可以重置索引,直接通过重置索引并偏移1来得到从1开始的序号:

import pandas as pd

# 模拟Mapping表数据
df = pd.DataFrame({
    'user_id': [41, 2, 73, 25],
    'prod_id': ['N12ad', 'nd5Ed', 'bDe4d', 'M87he']
})

# 添加ranking列
df['ranking'] = df.reset_index(drop=True) + 1

方法2:直接生成连续序列

基于DataFrame的行数,用range()生成从1开始的连续序号:

df['ranking'] = range(1, len(df) + 1)

方法3:用groupby+cumcount()模拟分区逻辑

通过将整个DataFrame作为一个分组(对应SQL的PARTITION BY (SELECT NULL)),再用cumcount()计数后偏移1:

df['ranking'] = df.groupby(lambda x: True).cumcount() + 1

内容的提问来源于stack exchange,提问作者hokkaidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:02:41