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

时间:2017-09-15 02:55:21

标签: 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 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')), (...)],
[...],[...]]

1 个答案:

答案 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)))

我想这可以改进。