我正在尝试将一个数据框转换为列表,我想保留标题名称,但我无法实现此目的。
我从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')), (...)],
[...],[...]]
答案 0 :(得分:2)
DataFrame.to_dict()的其中一个选项应该有用。
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)]
>>>
数据框只是实现我想要的结果的中间步骤。
似乎您可以直接从存储过程的输出中获取结果。我没办法测试这个,但是看看pypyodbc wiki 我想出了DataFrame的替代方案......
从连接对象
创建游标cursor = sql_connection.cursor()
重新格式化stored procedure call并执行
sp = "{{CALL {}}}".format(retrieve_database_values)
cursor.execute(sp)
然后从好的Hello World script
的方法三开始query_results = [dict(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()]
query_results
应该是我的DataFrame.to_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)))
我想这可以改进。