如何使用python将数据帧值及其标题转换为列表?
我试图将一个数据帧转换为一个列表,我想保留标题名称,但我无法实现这一点 我正在从SQL数据库下载数据,然后将此数据转换为数据帧:如何使用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
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']。你提供的所有不同可能性的完整解决方案是完整的,我希望这个答案能得到更多的分数。