Не получается умножить float на float

Есть датафрейм (df), полученный от Binance-API через импорт binance-python-connector в формате JSON, в котором хранятся float-значения (курс обмена), а также небольшой код, меняющий значения ячеек в столбце "unitPrice", умножая его на 0.1%:

response = client.c2c_trade_history("BUY")
df = pd.json_normalize(response, "data")
df["unitPrice"]=df.unitPrice*1.1

Выполнение данного кода приводило к ошибке:

can't multiply sequence by non-int of type 'float'

Я попытался поменять значения в столбце "unitPrice" на float, однако, прочитав заново ошибку, понял, что сделал абсолютно то же, что и привело к этой ошибке. Всё же прикреплю попытку:

response = client.c2c_trade_history("BUY")
df = pd.json_normalize(response, "data")
df["unitPrice"].astype(float)
df["unitPrice"]=df.unitPrice*1.1

Код ошибки идентичный:

can't multiply sequence by non-int of type 'float'

ВАЖНАЯ РЕМАРКА: Если попытаться изменить вид данных на integer в этом столбце, то это изменит и сам курс обмена, что мне категорически не нужно. Мне нужно получить именно float-значение с умножением на 0.1%.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Воспроизведение ошибки. Предположим что датафрейм содержит не сами вещественные числа, а строки с изображениями вещественных чисел:

import pandas as pd


df = pd.DataFrame(data={'unitPrice': ['1.', '2.']})
print(df)
print(df['unitPrice'] * 1.1)
$ python temp.py
  unitPrice
0        1.
1        2.
Traceback (most recent call last):
...
TypeError: can't multiply sequence by non-int of type 'float'

Ошибка проявляется так как строки умножаются на вещественный коэффициент. Исправление состоит в приведении типа. Приведённые значения присваиваются обратно тому же столбцу:

import pandas as pd


df = pd.DataFrame(data={'unitPrice': ['1.', '2.']})
print(df)
df['unitPrice'] = df['unitPrice'].astype(float)
print(df)
print(df['unitPrice'] * 1.1)
$ python temp.py
  unitPrice
0        1.
1        2.
   unitPrice
0        1.0
1        2.0
0    1.1
1    2.2
Name: unitPrice, dtype: float64

Умножение работает.

→ Ссылка