函数中的熊猫数据类型更改

时间:2018-11-13 14:25:04

标签: python pandas

一般背景

我编写了一个包含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.dtypesdf_stack.dtypes的打印输出语句,该函数没有作用。 / p>

这是为什么?

编辑

我已添加此图片以显示代码(如右图),该代码试图捕获错误键入的批次(12384),以及pd.to_numeric函数之前和之后的打印输出(均显示只是对象,没有数字列)。

enter image description here

我的基本问题包括两个部分:

  1. 什么会导致'Series' object has no attribute 'stack'? (从根本上讲,比错误的数据类型要重要-或者至少为什么数据类型会引起问题?)
  2. 为什么pd.numeric不会在这里引起任何变化?

0 个答案:

没有答案