pd.read_sql导致问题的unicode类型

时间:2016-08-17 19:22:33

标签: python python-2.7 pandas

我正在使用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

1 个答案:

答案 0 :(得分:1)

你正在尝试为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)