我最近决定再次接触 Python(7 年多之后),但我目前正在努力实现一些可以使用 MATLAB(我大部分时间使用的编程语言)在几秒钟内完成的事情。我的目标是查询 MS Access 数据库并保存结果,以便稍后可以对数据进行排序、过滤和操作。
我已成功查询数据库(使用 pyodbc)并将查询输出存储在变量“db_out”中。 我已经确认查询返回了 48 个结果,由 13 列组成,类型是列表。
print(len(db_out)) --> 48
print(len(db_out[0])) --> 13
print(type(db_out)) --> <class 'list'>
我继续在 Pandas Library 的帮助下将我的列表转换为 DataFrame。
my_data_frame = df = pd.DataFrame(db_out)
print(my_data_frame)
但是自从我得到这个(当我打印变量时)以来,列分隔似乎没有通过 DataFrame 传递:
0
0 [1, Name1, N, CAN, None, C, None, KDI1...
1 [1, Name2, N, CAN, None, C, None, KDI1...
.
.
.
47 [1, Name48, N, CAN, None, C, None, KDI1...
好吧,我得到了 48 行(从 0 到 47,但为什么只有一列?它认为整个事情是一个字符串吗?)
如何让 DataFrame 变成这样(请参阅下面的 2D 数组):
0 1 2 3 4 5 ... 7 8 9 10 11 12
0 1 Name1 N CAN None C ... KDI1 1 None 100000 17700.0 20200.0
1 1 Name2 N CAN None C ... KDI1 2 None 100000 17700.0 20200.0
.
.
.
47 1 Name1 N CAN None C ... KDI1 2 None 100000 17700.0 20200.0
我尝试了很多东西(以我有限的 Python 知识),但不知道如何完成这项工作。
真正让我困惑的是我可以打印“db_out”并得到这个:
[(1, 'Name1', 'N', 'CAN', None, 'C', None, 'KDI1', 1, None, 100000, 17700.0, 20200.0), (1, 'Name2', 'N', 'CAN', None, 'C', None, 'KDI1', 1, None, 100000, 17700.0, 20200.0), . . . Until the 48th query output.
通过逐字复制上面的打印结果并将其保存在变量中,可以使 DataFrame 具有我需要的结构。
在 Stackoverflow 的一些自动建议之后,我尝试了以下操作:
columns = ['col1','col2',...'col13']
my_new_data_frame=pd.DataFrame(db_out,columns=columns)
但我收到此错误:
ValueError:传递值的形状为 (48, 1),索引意味着 (48, 13)
看来我找到了一种获得所需输出结构的方法。在保存查询结果(使用 pyodbc)时,我正在迭代查询:
query_result = []
for x in cur.fetchall():
query_result.append(x)
我用 pd.read_sql_query 替换了上面直接创建 DataFrame 的迭代,给了我我期望的结构!!