我编写了一个包含MySQL查询的函数,对返回的数据(拉入pandas df)进行了一些修改。
enginedb =create_engine("mysql+mysqlconnector://user:pswd@10.0.10.26:3306/db",
encoding='latin1')
query = ("""Select blah blah""")
df = pd.read_sql(query, enginedb)
这很好用-查询是一个有意义的查询,具有多个联接等。但是,它在数据库中针对某个批次发生,数据类型已关闭:对于几乎所有“正常”批次,列的数据类型都是int64
,一些object
,一个datetime64[ns]
...,但到目前为止(除时间以外),所有日期时间都返回为object
。
我需要做一个堆栈-其中一列是一个列表,我有一些代码可以获取列表中的每一项并将它们逐行向下堆叠:
cols = list(df)
cols = cols[:-1]
df_stack = df.set_index(cols)['data'].apply(pd.Series).stack()
问题是,对于非标准数据类型,此操作不适用于此“奇数”批次(非标准数据类型的原因是由于上游ETL流程所致,我无法影响)。
确切的错误是:
'Series' object has no attribute 'stack'
因此,我合并了一个if/else
语句,以检查cols之一的dtype是否不正确,如果是,请进行更改:
if df['id'].dtype == 'int64':
df_stack = df.set_index(cols)['data'].apply(pd.Series).stack()
df_stack = df_stack.reset_index()
else:
df_stack = df.apply(pd.to_numeric, errors = 'coerce')
# it can't be more specific than for all the columns, as there are a LOT
但是这没有作用-我已经在函数中(包含查询和后续调整)包括了dy.dtypes
和df_stack.dtypes
的打印输出语句,该函数没有作用。 / p>
我已添加此图片以显示代码(如右图),该代码试图捕获错误键入的批次(12384),以及pd.to_numeric
函数之前和之后的打印输出(均显示只是对象,没有数字列)。
'Series' object has no attribute 'stack'
? (从根本上讲,比错误的数据类型要重要-或者至少为什么数据类型会引起问题?)