我正在格式化我使用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。
每列的dtype
为object
你试图为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)