为什么Pandas将SQL查询结果列名转为大写?如何避免该问题?
问题根源说明
列名自动转为大写并非pandas的行为,这是绝大多数关系型数据库(如Snowflake、Oracle、PostgreSQL等)的默认机制:对于SQL语句中没有用标识符包裹符包裹的列名、表名等,会自动统一转为大写(部分数据库转为小写)存储和返回。
固定列名查询场景解决方案
有两种可选方案:
- SQL层面强制保留大小写
给SQL中所有需要保留大小写的列名加上对应数据库的标识符包裹符(多数数据库用双引号,MySQL用反引号),示例代码:sql = f"""SELECT "OLD", "OLV", "Print", "Search", "TV" FROM decomposition""" self.cursor.execute(sql) df = self.cursor.fetch_pandas_all() - 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"]
动态列名查询场景解决方案
按以下步骤修改代码即可:
- 先删除现有代码中
columns_list = list(map(str.upper, columns_list))这行多余的大写转换逻辑 - 可选方案一:构造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() - 可选方案二:无需修改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
相关产品推荐
相关产品推荐

