如何将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
相关产品推荐
相关产品推荐

