将对象转换为float

时间:2018-05-31 21:23:52

标签: python pandas numpy

我有一个对象,我想转换为货币格式:

df_final.sum_funded.head()

0     472161.07
1     719768.97
2      23148.11
3    1215078.15
4             0

Name: sum_funded, dtype: object

我尝试过多次迭代,包括:

"${:,.0f}".format(df_final.sum_funded.astype(float) )     

产生错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-285-dd77177c4126> in <module>()
----> 1 "${:,.0f}".format(df_final.sum_funded.astype(float) )
  2 
  3 
  4 

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

为什么在我进行显式浮点转换时将其转换为str

2 个答案:

答案 0 :(得分:2)

您必须使用pandas Series的map函数在每个元素上应用格式化程序。

df_final.sum_funded.map("${:,.0f}".format)

答案 1 :(得分:1)

问题是您没有将float传递给format,而是将Series传递给它。 (Series可能dtype=float,但仍然是Series。)没有办法将Series格式化为单个数字,因为它是一大堆数字,所以你的代码不起作用。

如果您想知道为什么会出现这个特定错误:稍微过于简单的版本是对于没有__format__方法的任何对象,Python会obj.__str__().__format__(formatspec)。因此,Series转换为字符串,然后尝试格式化为浮点数。

如果要格式化 Series 中的每个值,而不是Series作为整体,则需要明确地执行此操作。例如,您可以使用mapapply(使用绑定到字符串str.format的方法"${:,.0f}"作为函数):

print(df_final.sum_funded.map("${:,.0f}".format))

...或循环遍历元素:

for elem in df_final.sum_funded:
    print("${:,.0f}".format(elem)

对于像+这样的运算符,以及Pandas(和Numpy / Scipy)对象上的方法,以及来自Pandas(或Numpy或Scipy)的函数,事情通常就像魔法一样 - 如果你给它们一个单个值,它们处理单个值;如果你给它们一个Series或DataFrame或数组,它们就可以处理每个元素。如果你编写自己的函数,除了运算符和Pandas函数和方法之外什么都不做,它就像魔法一样。

但是使用的函数和方法来自Pandas(或Numpy或Scipy)并尝试做除运算符和Pandas函数之外的任何事情,例如str.format,这不会发生了。它们不是按元素编写的,并且Pandas无法自动挂钩它们。所以,如果你想在整个系列(等)中映射它们,你必须明确地要求它。

这就是Pandas的mapapply以及类似的方法。或者你可以采用另一种方式并使用Numpy的vectorize将普通的愚蠢Python函数转换为Numpy / Pandas元素函数。或者你可以手动循环。但关键是,你需要做某事