如何使用python将数据帧值及其标题转换为列表?

如何使用python将数据帧值及其标题转换为列表?,python,sql-server,python-3.x,pandas,Python,Sql Server,Python 3.x,Pandas,我试图将一个数据帧转换为一个列表,我想保留标题名称,但我无法实现这一点 我正在从SQL数据库下载数据,然后将此数据转换为数据帧: import pypyodbc from datetime import datetime initial_date = datetime(2017,1,1,00,00,00) end_date = datetime(2017,6,1,00,00,00) sql_connection = pypyodbc.connect(driver="{SQL Serv

我试图将一个数据帧转换为一个列表,我想保留标题名称,但我无法实现这一点

我正在从SQL数据库下载数据,然后将此数据转换为数据帧:

import pypyodbc
from datetime import datetime

initial_date = datetime(2017,1,1,00,00,00)
end_date     = datetime(2017,6,1,00,00,00)

sql_connection = pypyodbc.connect(driver="{SQL Server}", server="xxx.xxx.xxx.xxx", uid="you-dont-know-me",
                                       pwd="guess...", Trusted_Connection="No")
#execute the SP to retrieve data
retrieve_database_values = "[DEV].[SP].[QA_ExportV2] @start_date='{start_date:%Y-%m-%d}', " \
                     "@end_date='{end_date:%Y-%m-%d'}".format(start_date=initial_date, end_date=end_date)

df = pd.read_sql_query(retrieve_database_values, sql_connection)
然后,我使用以下代码将此数据帧转换为列表:

df.values.tolist()
这给了我结果:

[[100008115, 'CAS.Santa', 'CAS.Santa-2', 'Yes', 'Transferred', Timestamp('2017-03-11 08:15:00'), ...],
[100008116, 'Springfield', 'Springfield:H3', 'Yes','Traffic Variation', Timestamp('2017-09-11 00:00:00'), ...],
[...],[...]]
但是,我希望能够检索数据帧的数据值和标题名称,如下所示:

[['id', 100008115, 'site','CAS.Santa', 'site name','CAS.Santa-2', 'new','Yes', 'status','Transferred', 'initial date' ,Timestamp('2017-03-11 08:15:00'), ...],
['id',100008116, 'site','Springfield', 'site name','Springfield:H3', 'new','Yes', 'status','Traffic Variation', 'initial date' ,Timestamp('2017-09-11 00:00:00'), ...],
[...],[...]]
[[('id', 100008115), ('site','CAS.Santa'), ('site name','CAS.Santa-2'), ('new','Yes'), ('status','Transferred'), ('initial date' ,Timestamp('2017-03-11 08:15:00')), (...)],
[('id',100008116), ('site','Springfield'), ('site name','Springfield:H3'), ('new','Yes'), ('status','Traffic Variation'), ('initial date' ,Timestamp('2017-09-11 00:00:00')), (...)],
[...],[...]]
或者,如果可能的话,像这样:

[['id', 100008115, 'site','CAS.Santa', 'site name','CAS.Santa-2', 'new','Yes', 'status','Transferred', 'initial date' ,Timestamp('2017-03-11 08:15:00'), ...],
['id',100008116, 'site','Springfield', 'site name','Springfield:H3', 'new','Yes', 'status','Traffic Variation', 'initial date' ,Timestamp('2017-09-11 00:00:00'), ...],
[...],[...]]
[[('id', 100008115), ('site','CAS.Santa'), ('site name','CAS.Santa-2'), ('new','Yes'), ('status','Transferred'), ('initial date' ,Timestamp('2017-03-11 08:15:00')), (...)],
[('id',100008116), ('site','Springfield'), ('site name','Springfield:H3'), ('new','Yes'), ('status','Traffic Variation'), ('initial date' ,Timestamp('2017-09-11 00:00:00')), (...)],
[...],[...]]
其中一个选择应该是可行的

import pandas as pd
df = pd.DataFrame({'a':[1, 2, 3], 'b':[2, 3, 3]})

>>> df
   a  b
0  1  2
1  2  3
2  3  3
>>>
>>> df.to_dict('records')
[{'a': 1, 'b': 2}, {'a': 2, 'b': 3}, {'a': 3, 'b': 3}]

>>> result = df.to_dict('records')
>>> for thing in result:
...     print(list(thing.items()))


[('a', 1), ('b', 2)]
[('a', 2), ('b', 3)]
[('a', 3), ('b', 3)]
>>>

数据帧只是实现我期望结果的中间步骤

似乎可以直接从存储过程的输出中获得结果。我没有办法测试这一点,但通过 我想出了这个数据帧的替代方案

从连接对象创建光标

cursor = sql_connection.cursor()
重新格式化并执行

sp = "{{CALL {}}}".format(retrieve_database_values)
cursor.execute(sp)
然后从尼斯的方法三开始

query\u results
应该是一个dict列表,如我的DataFrame.to\u dict()解决方案中的
result

如果我正确地理解了这个理解,
zip
会生成元组,所以我认为您需要的是

query_results = [list(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()]
#OR
query_results = []
for row in cursor.fetchall():
    column_names = [column[0] for column in cursor.description]
    query_results.append(list(zip(column_names, row)))

我想这是可以改进的。

你看过文档了吗?有这个
df.columns.values.tolist()
但是它会抛出列值,也就是,
[id,site,site name,new,…]
不是我想要的结果。看起来您想要类似于键值对的结果。是的,类似于包含键和值的元组的列表。您是将数据帧用于其他用途,还是只是获得所需结果的中间步骤?不是答案:)我尝试了您今天提供的所有方法,我想实现
query\u results=[list(zip)([column[0]对于cursor.description]中的列,行)对于cursor.fetchall()]
生产中的行,但似乎解决方案
df.to_dict()
将坚持到我们的最终产品中,因为我立即使用以下代码获得df.to_dict('records')中li的所有id,id为[li['id']。你提供的所有不同可能性的完整解决方案是完整的,我希望这个答案能得到更多的分数。