我正在使用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
。
答案 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)