如何在pandasql查询中基于多列组合生成row_number列
解决pandasql中基于列组合生成row_number的问题
你的查询无法运行主要有两个核心原因:
- pandasql默认使用SQLite引擎,而SQLite不允许整数与字符串直接用
||拼接,必须先将数值类型转为文本格式 ROW_NUMBER()窗口函数必须搭配ORDER BY子句,否则会触发语法错误
同时建议给生成的行号列指定别名,避免出现无列名的混乱情况。
修正后的代码
import pandas as pd from pandasql import sqldf tabla_1= pd.DataFrame(['a','b','c'],columns=['letras']) tabla_2= pd.DataFrame([1,2],columns=['numeros']) tabla_3= pd.DataFrame(['rojo','verde'],columns=['colores']) pysqldf = lambda q: sqldf(q, globals()) # 可正常运行的查询语句 q = ''' SELECT letras, numeros, colores, ROW_NUMBER() OVER ( PARTITION BY letras || CAST(numeros AS TEXT) ORDER BY colores ) AS row_num FROM tabla_1 CROSS JOIN tabla_2 CROSS JOIN tabla_3 ''' result = pysqldf(q) print(result)
关键修改说明
- 类型转换:用
CAST(numeros AS TEXT)将整数类型的numeros转为字符串,确保和letras拼接时不会触发类型不兼容错误 - 补充ORDER BY:在窗口函数中指定
ORDER BY colores(你也可以替换为其他列或常量,只要符合你的排序需求),满足SQLite对窗口函数的语法要求 - 添加列别名:给
ROW_NUMBER()结果指定row_num作为列名,方便后续的引用和识别
预期运行结果示例
| letras | numeros | colores | row_num |
|---|---|---|---|
| a | 1 | rojo | 1 |
| a | 1 | verde | 2 |
| a | 2 | rojo | 1 |
| a | 2 | verde | 2 |
| b | 1 | rojo | 1 |
| b | 1 | verde | 2 |
| b | 2 | rojo | 1 |
| b | 2 | verde | 2 |
| c | 1 | rojo | 1 |
| c | 1 | verde | 2 |
| c | 2 | rojo | 1 |
| c | 2 | verde | 2 |
内容的提问来源于stack exchange,提问作者Julio Ortegón
相关产品推荐
相关产品推荐

