проблема преобразования объекта в плавающее - PullRequest
0 голосов
/ 01 июня 2018

У меня есть объект, который я хотел бы преобразовать в валютный формат:

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 голосов
/ 01 июня 2018

Проблема в том, что вы не передаете float на format, вы передаете ему Series.(A 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, этого не происходит.Они не были написаны, чтобы работать поэлементно, и у Панд не было возможности автоматически их зацепить.Итак, если вы хотите отобразить их по всей Серии (и т. Д.), Вы должны явно попросить об этом.

Это то, что Панды 'map и apply и аналогичные методы для.Или вы можете пойти другим путем и использовать Numpy vectorize, чтобы превратить обычную немую функцию Python в поэлементную функцию Numpy / Pandas.Или вы можете просто зациклить вручную.Но дело в том, что вам нужно сделать что-то .

0 голосов
/ 01 июня 2018

Вы должны использовать функцию map серии Pandas, чтобы применить форматер к каждому элементу .

df_final.sum_funded.map("${:,.0f}".format)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...