Задача может быть относительно легко решена, если строки Incorrect_Price
сохраняют структуру, представленную в примерах (числа не выражены словами).
Используя регулярные выражения, вы можете извлечь числовую часть инеобязательный "цент" / "центы" или "доллар" / "доллары" с использованием подхода из аналогичного вопроса SO .Два основных различия заключаются в том, что вы ищете пары числовых значений и "цент [с]" или "доллар [с]" и что они потенциально встречаются более одного раза.
import re
def extract_number_currency(value):
prices = re.findall('(?P<value>[\d]*[.]?[\d]{1,2})\s*(?P<currency>cent|dollar)s?', value)
result = 0.0
for value, currency in prices:
partial = float(value)
if currency == 'cent':
result += partial / 100
else:
result += partial
return result
print(extract_number_currency('3 dollars and 49 cent'))
3.49
Теперь вам нужно применить эту функцию ко всем неверным значениям в столбце с ценами в словах.Для простоты я применяю его здесь ко всем значениям (но я уверен, что вы сможете справиться с подмножеством):
data['Desired'] = data['Incorrect_Price'].apply(extract_number_currency)
Вуаля!
Разбивкарегулярное выражение '(?P<value>[\d]*[.]?[\d]{1,2})\s*(?P<currency>cent|dollar)s?'
Есть два захвата с именем групп (?P<name_of_the_capture_group> .... )
Первая группа захвата (?P<value>[\d]*[.]?[\d]{1,2})
захватов:
[\d]
-цифры
[\d]*
- повторяется 0 или более раз
[.]?
- с последующей необязательной (?
) точкой
[\d]{1,2}
- с последующим повторением цифрыот 1 до 2 раз
\s*
- обозначает 0 или более пробелов
Теперь 2-я группа захвата, которая намного проще: (?P<currency>cent|dollar)
cent|dollar
- этосводится к альтернативе между cent
и dollar
захватываемыми строками
s?
является необязательным множественным числом 'центов с ' или 'долларовых с '