我最近决定再次使用Python(在7年多之后),但我目前正在努力实现使用MATLAB(我大部分时间使用的编程语言)在几秒钟内完成的事情。我的目标是查询MS Access DB并保存结果,以便以后对数据进行排序、筛选和操作。
我已经成功地查询了数据库(使用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-Array):
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)
1条答案
按热度按时间1yjd4xko1#
看来我找到了一种方法来获得所需的输出结构。在保存查询结果时(使用pyodbc),我正在迭代查询:
我直接用www.example.com _sql_query替换了上面创建DataFrame的迭代pd.read,得到了我所期望的结构!!