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

为什么Pandas将SQL查询结果列名转为大写?如何避免该问题?

问题根源说明

列名自动转为大写并非pandas的行为,这是绝大多数关系型数据库(如Snowflake、Oracle、PostgreSQL等)的默认机制:对于SQL语句中没有用标识符包裹符包裹的列名、表名等,会自动统一转为大写(部分数据库转为小写)存储和返回。


固定列名查询场景解决方案

有两种可选方案:

  1. SQL层面强制保留大小写
    给SQL中所有需要保留大小写的列名加上对应数据库的标识符包裹符(多数数据库用双引号,MySQL用反引号),示例代码:
    sql = f"""SELECT 
              "OLD", "OLV", "Print", "Search", "TV" 
              FROM decomposition"""
    self.cursor.execute(sql)
    df = self.cursor.fetch_pandas_all()
    
  2. Python层面重命名列
    已知查询列顺序的情况下,直接给DataFrame的columns属性赋值为你期望的列名列表即可:
    sql = f"""SELECT 
              OLD, OLV, Print, Search, TV 
              FROM decomposition"""
    self.cursor.execute(sql)
    df = self.cursor.fetch_pandas_all()
    df.columns = ["OLD", "OLV", "Print", "Search", "TV"]
    

动态列名查询场景解决方案

按以下步骤修改代码即可:

  1. 先删除现有代码中columns_list = list(map(str.upper, columns_list))这行多余的大写转换逻辑
  2. 可选方案一:构造SQL时给所有列名加标识符包裹符,强制数据库返回原大小写列名,示例代码:
    # 查询动态列列表,保留原始大小写
    sql = f"""SELECT distinct(MEDIACHANNEL) as columns
              FROM Mediachannels
              WHERE brand = '{brand}'
              ORDER by MEDIACHANNEL"""
    self.cursor.execute(sql)
    df = self.cursor.fetch_pandas_all()
    columns_list = df["COLUMNS"].tolist()
    
    # 给每个列名加双引号包裹
    quoted_columns = ", ".join([f'"{col}"' for col in columns_list])
    
    # 执行查询
    sql = f"""SELECT 
              {quoted_columns} 
              FROM decomposition"""
    self.cursor.execute(sql)
    df = self.cursor.fetch_pandas_all()
    
  3. 可选方案二:无需修改SQL,查询完成后直接用你拿到的原始列名列表覆盖DataFrame的列名即可,因为查询列的顺序和你拼接的columns顺序完全一致:
    # 查询动态列列表,保留原始大小写
    sql = f"""SELECT distinct(MEDIACHANNEL) as columns
              FROM Mediachannels
              WHERE brand = '{brand}'
              ORDER by MEDIACHANNEL"""
    self.cursor.execute(sql)
    df = self.cursor.fetch_pandas_all()
    columns_list = df["COLUMNS"].tolist()
    
    # 拼接SQL执行查询
    columns = ", ".join(columns_list)
    sql = f"""SELECT {columns} FROM decomposition"""
    self.cursor.execute(sql)
    df = self.cursor.fetch_pandas_all()
    
    # 直接覆盖列名
    df.columns = columns_list
    

注意事项

如果你选择SQL层面加双引号的方案,需要确保你的decomposition表的列名存储时确实和MEDIACHANNEL表中存的大小写一致,否则会报列不存在的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:15:02