如何将含COUNT(*) OVER()的SQL语句转换为Python实现?
Python(Pandas)实现SQL窗口函数COUNT(*) OVER()的需求
核心思路
原SQL逻辑是先按userID分组统计每个用户的记录数Ct,再通过窗口函数COUNT(*) OVER()获取分组后的总用户数(即分组结果的总行数),并将该数值附加到每一行。用Pandas可以分两步实现:
- 第一步:按
userID分组,统计每个用户的记录数得到Ct - 第二步:计算分组结果的总行数,将其作为固定值赋给所有行的
Total_Ct列
代码实现
先模拟原CTE的数据源(假设原数据包含重复的userID条目):
import pandas as pd # 模拟原cte中的数据 data = { 'userID': ['A1', 'A1', 'A1', 'A1', 'A1', 'A2', 'A2', 'A2', 'A3', 'A4', 'A4', 'A5', 'A5', 'A5', 'A5', 'A5', 'A6', 'A6', 'A6', 'A6', 'A6', 'A6', 'A7', 'A7', 'A7', 'A7'] } cte = pd.DataFrame(data)
接着执行分组统计和添加总用户数:
# 第一步:分组统计每个userID的Ct result = cte.groupby('userID').size().reset_index(name='Ct') # 第二步:给所有行添加Total_Ct,值为分组结果的总行数(总用户数) result['Total_Ct'] = len(result) # 打印结果 print(result)
输出结果
运行代码后会得到与预期一致的输出:
userID Ct Total_Ct 0 A1 5 7 1 A2 3 7 2 A3 1 7 3 A4 2 7 4 A5 5 7 5 A6 6 7 6 A7 4 7
扩展:计算用户占比
如果需要计算每个用户的记录数占比Ct/Total_Ct,直接新增列即可:
result['Ratio'] = result['Ct'] / result['Total_Ct']
内容的提问来源于stack exchange,提问作者tj1
相关产品推荐
相关产品推荐

