我有一个对象,我想转换为货币格式:
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
?
答案 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
作为整体,则需要明确地执行此操作。例如,您可以使用map
或apply
(使用绑定到字符串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的map
和apply
以及类似的方法。或者你可以采用另一种方式并使用Numpy的vectorize
将普通的愚蠢Python函数转换为Numpy / Pandas元素函数。或者你可以手动循环。但关键是,你需要做某事。