Python项目中SQL数据无法完整导入Pandas DataFrame求助
问题分析与解决方案
核心问题
- SQL聚合列未指定别名:你的
SUM(amount)没有设置别名,导致Pandas返回的DataFrame中这一列的列名是默认的SUM(amount),后续指定amount列名时无法匹配对应数据。 - 冗余的DataFrame二次包装+列顺序错误:
pd.read_sql_query本身就会返回标准DataFrame,无需再用pd.DataFrame()重新构造。且你指定的列顺序['amount', 'category_in_out_id']和SQL查询返回的列顺序(category_in_out_id在前、聚合值在后)完全相反,直接导致数据错位。 - 变量未定义笔误:代码中
df_trans_all用到的sql_query_trans_all变量未声明,属于明显的拼写/逻辑错误。
修正后的代码
# 获取按分类分组的交易数据,给聚合列添加别名 sql_query_trans_cat = pd.read_sql_query(''' SELECT category_in_out_id, SUM(amount) AS amount -- 为聚合结果指定明确列名 FROM Transactions GROUP BY category_in_out_id ''', conn) print(f"------------->> DEBUG Output of sql_query_trans_cat <<--------------------- {sql_query_trans_cat}") # 注意:sql_query_trans_all需要补充对应的查询语句,否则会报错,暂注释 # df_trans_all = pd.DataFrame(sql_query_trans_all, columns = ['id', 'hash', 'valutadate', 'amount', 'transaction_text_id', # 'account_id', 'asset_class_id', 'category_in_out_id', 'currency_id', 'int_or_ext_id', 'remarks']) # 直接使用read_sql返回的DataFrame,按需调整列顺序 df_trans_cat = sql_query_trans_cat[['category_in_out_id', 'amount']] print(f"------------->> DEBUG Output of df_trans_cat <<--------------------- {df_trans_cat}") print(f"------------->> DEBUG Output of df_trans_cat Data Types <<--------------------- {df_trans_cat.dtypes}")
补充说明
pd.read_sql_query从数据库读取数据后,会直接封装为DataFrame,无需二次构造。- SQL查询中必须给聚合函数的结果指定别名,否则Pandas会用原始函数表达式作为列名,后续引用极易出错。
- 若需调整DataFrame列顺序,直接通过
df[['列名1', '列名2']]的方式选择即可,避免因列顺序不匹配导致的数据错位。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

