Как вы можете использовать math.modf в фрейме данных?

Я понимаю, что 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 целочисленной, но все равно получаю ту же ошибку, пожалуйста, помогите!

Вам нужно применить math.modf для каждого элемента, к серии, используйте применить

Dani Mesejo 15.12.2020 13:32

Используйте df.apply, который аналогичен map, используемому в DataFrame.

JenilDave 15.12.2020 13:42

блестяще это работает. Теперь вы можете помочь мне избавиться от всего, чтобы я оставил только часть? Я использую dataset['Trade price float'] = dataset['Trade Price'].apply(math.modf), но я не хочу (0.40000000000000057, 123.0) Я просто хочу первую часть

John Sonnino 15.12.2020 13:43

В документе math.modf ясно сказано, что он возвращает кортеж из двух чисел с плавающей запятой со знаком (fractional_part, integer_part). Не строка. И если вам нужна только целая часть, вы можете нарезать [0], но на самом деле вам даже не нужно modf, вы можете просто сделать .astype(int)

smci 13.02.2022 02:09

Однострочный ответ: а) не используйте math.modf в фрейме данных, используйте np.modf, он векторизован. б) Но в вашем случае int(modf(df['Price'])) — это просто обфускация для df['Price'].astype(int). (Если бы вы использовали modf(), вы бы нарезали [0] только для получения целой части и в любом случае выбросили бы дробную часть.)

smci 17.02.2022 00:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
500
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка: TypeError: cannot convert the series to <class 'float'> связана с тем, что вы передаете серию в math.modf, поэтому вам нужно либо...

а) apply() функция к каждому элементу Серии:

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

или:

б) лучше использовать numpy.modf, который векторизован:

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

c) ОБНОВЛЕНИЕ: если вам нужна только первая (целочисленная) часть, вы можете сделать:

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

John Sonnino 15.12.2020 13:50

@JohnSonnino Я только что проверил код, убедитесь, что вы скопировали правильно

Dani Mesejo 15.12.2020 13:52

извините, но я получаю эту ошибку ValueError: cannot reindex from a duplicate axis, когда пытаюсь взять первый предмет

John Sonnino 15.12.2020 14:00

что для этого нужно сделать? dataset['Trade price float'] = dataset['Trade Price'].apply(math.modf)[0] кажется, не нравится индекс в конце

John Sonnino 15.12.2020 14:01

@JohnSonnino Используйте версию numpy быстрее и проще в использовании, в противном случае вам нужно сделать dataset['Trade price float'] = dataset['Trade Price'].apply(lambda x: math.modf(x)[0])

Dani Mesejo 15.12.2020 14:03

Другие вопросы по теме