如何使 pandas.read_sql() 不将所有标题转换为小写

Posted

技术标签:

【中文标题】如何使 pandas.read_sql() 不将所有标题转换为小写【英文标题】:how to make pandas.read_sql() not convert all headers to lower case 【发布时间】:2016-07-18 18:38:28 【问题描述】:

我有一个函数可以将 SQL 服务器中的表中的表提取到 Python 中的数据框中,但它会强制所有列标题为小写。代码如下:

connection = pypyodbc.connect('Driver=SQL Server;'
                              'Server='   + server   + ';'
                              'Database=' + database + ';'
                              'uid='      + username + ';'
                              'pwd='      + password + ';')
query = 'SELECT * FROM ' + tableName

#set dict value to dataframe imported from SQL
tableDict[tableName] = pd.read_sql(query, connection)

SQL 中的标题例如:pmiManufacturingHeadline_Level 它在我的熊猫数据框中显示为:pmimanufacturingheadline_level

有人知道如何让 pandas.read_sql 保持原来的大小写吗?

【问题讨论】:

【参考方案1】:

我认为 PyPyODBC 会为你做到这一点:

这是我在PyPyODBC ver 的源代码中找到的。 1.3.3行:28-29:

version = '1.3.3'
lowercase=True

和第 1771-1772 行:

        if lowercase:
            col_name = col_name.lower()

因此您可以根据需要更改行为:

import pypyodbc
pypyodbc.lowercase = False  # force the ODBC driver to use case-sensitive column names

【讨论】:

啊,我明白了!那是危险的领域,但我可能会尝试哈哈。谢谢 将小写更改为 False 并重新安装该自定义包。这行得通。非常感谢! @jjvandermade,总是乐于提供帮助:) 有趣的是 PyODBC also has the lowercase option 但默认为 False【参考方案2】:

我知道这个问题使用 SQL Server 和 PyODBC,但对于通过 Google 来到这里并使用 PostgreSQL / psycopg2 的每个人:PostgreSQL 会自动将不带引号的列名转换为小写,所以如果您有类似的查询

SELECT foo AS MY_FOO FROM some_table

然后你会从pd.read_sql 得到一个my_foo 列。

要恢复预期的拼写,请按如下方式引用列别名:

SELECT foo AS "MY_FOO" FROM some_table

但是请注意,这仅适用于别名没有问题。关于实际的列名,您必须使用创建列时使用的拼写,这可能是小写的(有意或通过自动转换)。

详情请见this SO question。

【讨论】:

以上是关于如何使 pandas.read_sql() 不将所有标题转换为小写的主要内容,如果未能解决你的问题,请参考以下文章

带参数的 Pandas read_sql

pandas read_sql 没有读取所有行

在 pandas 中为 read_sql 指定 dtypes

Pandas read_sql() 可以返回哪些异常

使用 pandas.read_sql 和 MSAccess 的特定表名的“sql 执行失败”

Python pandas read_sql 返回生成器对象