Я понимаю, что math.modf возвращает строку, потому что это оболочка стандарта языка C, но это означает, что я получаю сообщение об ошибке TypeError: cannot convert the series to <class 'float'>
, когда пытаюсь добавить число с плавающей запятой в качестве столбца в свой фрейм данных. Вот мой код:
dataset = pd.read_csv('scandi_short.csv', error_bad_lines=False,
names=['Bloomberg Code', 'index', 'Bid Price', 'Ask Price', 'Trade Price','Bid Volume','Ask Volume','Trade Volume','Update type','Change to Ask','Date','Time in seconds past midnight','Opening price','Condition codes','na','na2'])
dataset['Trade price float'] = int(math.modf(dataset['Trade Price']))
print(dataset)
Как видите, я попытался сделать функцию math.modf целочисленной, но все равно получаю ту же ошибку, пожалуйста, помогите!
Используйте df.apply
, который аналогичен map
, используемому в DataFrame.
блестяще это работает. Теперь вы можете помочь мне избавиться от всего, чтобы я оставил только часть? Я использую dataset['Trade price float'] = dataset['Trade Price'].apply(math.modf)
, но я не хочу (0.40000000000000057, 123.0) Я просто хочу первую часть
В документе math.modf ясно сказано, что он возвращает кортеж из двух чисел с плавающей запятой со знаком (fractional_part, integer_part)
. Не строка. И если вам нужна только целая часть, вы можете нарезать [0], но на самом деле вам даже не нужно modf
, вы можете просто сделать .astype(int)
Связанный, почти дублирующийся: Панды получают часть десятичного дробного числа из числа с плавающей запятой в фрейме данных
Однострочный ответ: а) не используйте math.modf
в фрейме данных, используйте np.modf
, он векторизован. б) Но в вашем случае int(modf(df['Price']))
— это просто обфускация для df['Price'].astype(int)
. (Если бы вы использовали modf()
, вы бы нарезали [0]
только для получения целой части и в любом случае выбросили бы дробную часть.)
Ошибка: TypeError: cannot convert the series to <class 'float'>
связана с тем, что вы передаете серию в math.modf
, поэтому вам нужно либо...
import math
import numpy as np
import pandas as pd
s = pd.Series([1.5, 2.3, 4.0])
res = s.apply(math.modf)
print(res)
Выход
0 (0.5, 1.0)
1 (0.2999999999999998, 2.0)
2 (0.0, 4.0)
dtype: object
или:
import math
import numpy as np
import pandas as pd
s = pd.Series([1.5, 2.3, 4.0])
res_np = pd.Series(zip(*np.modf(s)))
print(res_np)
Выход
0 (0.5, 1.0)
1 (0.2999999999999998, 2.0)
2 (0.0, 4.0)
dtype: object
res = s.apply(lambda x: math.modf(x)[0])
print(res)
res_np, _ = np.modf(s)
print(res_np)
Я получаю TypeError: 'builtin_function_or_method' object is not subscriptable
@JohnSonnino Я только что проверил код, убедитесь, что вы скопировали правильно
извините, но я получаю эту ошибку ValueError: cannot reindex from a duplicate axis
, когда пытаюсь взять первый предмет
что для этого нужно сделать? dataset['Trade price float'] = dataset['Trade Price'].apply(math.modf)[0]
кажется, не нравится индекс в конце
@JohnSonnino Используйте версию numpy быстрее и проще в использовании, в противном случае вам нужно сделать dataset['Trade price float'] = dataset['Trade Price'].apply(lambda x: math.modf(x)[0])
Вам нужно применить math.modf для каждого элемента, к серии, используйте применить