pd.Read_sql unicode类型导致问题



我正在格式化我使用sqlalchemy, pyodbc和pandas read_sql从数据库中提取的一些数据,我将其作为数据框df返回。

我想在数据框的每个"单元格"中应用数据格式,逐行,不包括前两列,使用这个:

df.iloc[6, 2:] = (df.iloc[6, 2:]*100).map('{:,.2f}%'.format) 

我对数据框架中的其他几行应用了类似的格式。当我从csv文件中读取数据时,这曾经工作得很好,但是现在从数据库中读取会导致ValueError在那行上读取:

ValueError: Unknown format code 'f' for object of type 'unicode'

我尝试了一些其他的铸造尝试,如:df.iloc[6, 2:] = (float(df.iloc[6, 2:].encode())*100).map('{:,.2f}%'.format),但这会导致一些额外的错误。

我很确定这个错误是由结果的unicode类型引起的。我应该如何格式化我的数据框架或修改我的read_sql没有unicode字符串?顺便说一下,我正在使用python 2.7。

每列的dtypeobject

你试图为float做字符串格式化,但你实际上传递了一个字符串。

要说明错误的来源,请考虑以下内容:

'{:,.2f}%'.format(u'1')

会引发相同的错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-41-fb59302ab6b7> in <module>()
----> 1 '{:,.2f}%'.format(u'1')
ValueError: Unknown format code 'f' for object of type 'unicode'

要解决这个问题,将字符串(dtype = object)列转换为浮动,例如

# get columns to cast to float
vals = df.select_dtypes(['object']).astype(float)
cols = vals.columns
# and replace them
df[cols] = vals

或者,您可以在映射器中放入一些逻辑,例如

def safe_float_formatter(value):
    try:
        return '{:,.2f}%'.format(value)
    except ValueError:
        return value
df.map(safe_float_formatter)

相关内容

最新更新