如何将单列值与括号之间的其他数据拆分为多列DataFrame?

问题描述 投票:0回答:1

我最近决定再次接触 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)

python pandas pyodbc
1个回答
0
投票

看来我找到了一种获得所需输出结构的方法。在保存查询结果(使用 pyodbc)时,我正在迭代查询:

    query_result = []
    for x in cur.fetchall():
        query_result.append(x)

我用 pd.read_sql_query 替换了上面直接创建 DataFrame 的迭代,给了我我期望的结构!!

© www.soinside.com 2019 - 2024. All rights reserved.