如何在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
相关产品推荐
相关产品推荐

