使用 python 从数据库中读取 csv 数据作为 DataFrame 时出现错误的列,但在 jupiter notebook 中执行时出现正确的列

Wrong columns when reading csv data from a DB as DataFrames with python, but right columns when executin in jupiter notebook

提问人:user22826714 提问时间:10/30/2023 最后编辑:user22826714 更新时间:10/30/2023 访问量:47

问:

我的数据库中有一个表,其中有 8 列,1 列用于 id,7 列以二进制形式存储 csv 数据作为 BLOB,我读取 csv 数据,将其解剖并将 7 个 csv 列中的每一列保存在一个 panda 数据帧中。

我的代码如下:

engine = create_engine('sqlite:///test.db')
metadata_obj = MetaData()
metadata_obj.reflect(bind=engine)
Tabla1 = Table('Tabla1', metadata_obj, autoload_with=engine)
Session = sessionmaker(bind=engine)
session = Session()

query1= session.query(Tabla1).filter_by(idCliente=2).all()

for i in query1:

    df1=pd.DataFrame(pickle.loads(i.df1))
    df2=pd.DataFrame(pickle.loads(i.df2))
    df3=pd.DataFrame(pickle.loads(i.df3))
    df4=pd.DataFrame(pickle.loads(i.df4))
    df5=pd.DataFrame(pickle.loads(i.df5))
    df6=pd.DataFrame(pickle.loads(i.df6))
    df7=pd.DataFrame(pickle.loads(i.df7))
    
    df_list = [df1, df2, df3, df4, df5, df6, df7]
    df_names = ['df1', 'df2', 'df3', 'df4', 'df5', 'df6', 'df7']
    
    df_dict = dict(zip(df_names, df_list))

print(df1.columns)

当我在 jupyter notebook 中执行此代码时,我没有问题,并且我获得了数据帧的正确列名,但是如果我在 cmd 中作为 python main.py 执行,我没有得到正确的列,而是将数据的第一行设置为列。 我该如何解决这个问题?

我已经检查了 jupyter notebook 和我的脚本上的 python、pandas、sqlalchemy 和 pickle 的版本:

print('pandas',pd.__version__)
print('sqlalchemy',sqlalchemy.__version__)
print('python',python_version())
print('pickle',pickle.format_version)

我在两者上都得到了相同的版本:

pandas 2.1.0
sqlalchemy 2.0.21
python 3.9.13
pickle 4.0
Python pandas DataFrame Jupyter-notebook sqlalchemy

评论

0赞 9769953 10/30/2023
您应该首先在独立程序和笔记本中检查所用包和 Python 的所有版本信息:Python、SQLAlchemy、Pandas;直接在代码中打印版本号。这样一来,您就知道至少您正在处理同样的事情(运行 Jupyter 笔记本往往会使用不同的 Python 内核和不同的包,从而产生不同的结果)。
0赞 user22826714 10/30/2023
@9769953我用 Python pandas 和 sqlalchemy 的版本编辑了我的问题,两者的版本相同
0赞 9769953 10/30/2023
比如说,结果是什么?和?第一行问题听起来好像是将其参数读取为 TextIO 对象或类似的东西,即它解析其输入,而不是复制数据帧。(您可能需要进行更多的调试,使用调试器或仅打印出重要变量的值和类型。print(pickle.loads(i.df1))print(type(pickle.loads(i.df1)))pd.DataFrame
0赞 9769953 10/30/2023
由于您只打印 ,因此删除所有其他数据帧以及 和 线是否有所作为?您需要创建一个最小的玩具示例来调试您的问题。df1.columnsdf_listdf_namesdf_dict

答: 暂无答案