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

如何将QuestDB查询结果正确导入Pandas DataFrame并保留原列名

问题原因

你直接将cursor.fetchall()返回的仅包含行数据的元组列表传入DataFrame构造函数,没有携带查询结果的列名元数据,因此pandas默认使用从0开始的连续数字作为列名。

解决方法

方法1:手动提取列名构造DataFrame

从psycopg2游标对象的description属性中可以提取到查询结果的列名信息,在构造DataFrame时通过columns参数传入即可。
修改后的完整代码如下:

import psycopg2
import pandas as pd

dataframe = pd.DataFrame()
try:
    connection = psycopg2.connect(user="myuser",
                                  password="mypassword",
                                  host="127.0.0.1",
                                  port="8812",
                                  database="qdb")
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM my_table")
    # 从游标元数据提取列名
    columns = [desc[0] for desc in cursor.description]
    dataframe = pd.DataFrame(cursor.fetchall(), columns=columns)

except (Exception, psycopg2.Error) as error:
    print("Error while connecting to QuestDB", error)
finally:
    if (connection):
        cursor.close()
        connection.close()
        print("QuestDB connection closed")
print(dataframe)

方法2:直接使用pandas内置read_sql方法(更简便)

pandas原生支持从SQL连接直接读取查询结果,自动处理列名映射,不需要手动操作游标和提取元数据:

import psycopg2
import pandas as pd

dataframe = pd.DataFrame()
try:
    connection = psycopg2.connect(user="myuser",
                                  password="mypassword",
                                  host="127.0.0.1",
                                  port="8812",
                                  database="qdb")
    # 直接用read_sql查询,自动保留列名
    dataframe = pd.read_sql("SELECT * FROM my_table", connection)

except (Exception, psycopg2.Error) as error:
    print("Error while connecting to QuestDB", error)
finally:
    if (connection):
        connection.close()
        print("QuestDB connection closed")
print(dataframe)

两种方法均兼容QuestDB的PostgreSQL协议适配,均可正确保留原表列名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:36:03