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

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

关键修改说明

  1. 类型转换:用CAST(numeros AS TEXT)将整数类型的numeros转为字符串,确保和letras拼接时不会触发类型不兼容错误
  2. 补充ORDER BY:在窗口函数中指定ORDER BY colores(你也可以替换为其他列或常量,只要符合你的排序需求),满足SQLite对窗口函数的语法要求
  3. 添加列别名:给ROW_NUMBER()结果指定row_num作为列名,方便后续的引用和识别

预期运行结果示例

letrasnumeroscoloresrow_num
a1rojo1
a1verde2
a2rojo1
a2verde2
b1rojo1
b1verde2
b2rojo1
b2verde2
c1rojo1
c1verde2
c2rojo1
c2verde2

内容的提问来源于stack exchange,提问作者Julio Ortegón

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:40:57