您好,我想从数据库中获取一个表,但包含字段名称,以便我可以从列标题中使用它们,例如我不一定提前知道所有字段名称的 Pandas
所以如果我的数据库看起来像
table test1
a | b | c
---+---+---
1 | 2 | 3
1 | 2 | 3
1 | 2 | 3
1 | 2 | 3
1 | 2 | 3
我该如何做
import psycopg2 as pq
cn = pq.connect('dbname=mydb user=me')
cr = cn.cursor()
cr.execute('SELECT * FROM test1;')
tmp = cr.fetchall()
tmp
这样 tmp 显示
[('a','b','c'),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3)]
谢谢
如果您想要的是一个数据框,其中数据库表中的数据作为其值,并且数据框列名称是您从数据库中读取的字段名称,那么这应该可以满足您的要求:
import psycopg2 as pq
cn = pq.connect('dbname=mydb user=me')
cr = cn.cursor()
cr.execute('SELECT * FROM test1;')
tmp = cr.fetchall()
# Extract the column names
col_names = []
for elt in cr.description:
col_names.append(elt[0])
# Create the dataframe, passing in the list of col_names extracted from the description
df = pd.DataFrame(tmp, columns=col_names)
列名称可以为
cr.description[0][0]
、cr.description[1][0]
等。如果您希望它完全按照您显示的格式,您需要做一些工作来提取它并将其粘贴在结果集前面。
你也可以映射它,看起来更好一点:
cursor.execute(open("blah.sql", "r").read())
data = cursor.fetchall()
cols = list(map(lambda x: x[0], cursor.description))
df = DataFrame(data, columns=cols)
您可以使用两个循环情况,而不使用 pandas:
temp = []
for x in result:
temp2 = {}
c = 0
for col in cursor.description:
temp2.update({str(col[0]): x[c]})
c = c+1
temp.append(temp2)
print(temp)
这将打印这样的内容:
[{'column1':'foo1','column2':'foo1'},{'column1':'foo2','column2':'foo2'},...]
希望这对您有帮助!干杯
import psycopg2 as pq
cn = pq.connect('dbname=mydb user=me')
cr = cn.cursor()
cr.execute('SELECT * FROM test1;')
tmp = cr.fetchall() #Hi, these are your codes that build a connection to a psql server
cols = []
for col in tmp.description:
cols.append(col[0]) #Collect all column names into an empty list, cols
tmp.insert(0, tuple(cols)) #insert elements by list.insert(index, new_item) method
输出为
[('a','b','c'),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3)]
将我的答案交叉发布到一个几乎相同的问题。
您不必在单独的语句中分配列名称,也不应该进行任何循环。
import psycopg2, pandas
con=psycopg2.connect(
dbname=DBNAME,
host=HOST,
port=PORT,
user=USER,
password=PASSWORD
)
sql = """
select * from x
"""
d = pandas.read_sql_query(sql,con)
con.close()
print(type(d))
print(pandas.DataFrame.head(d))