Извлечение чисел из строк из столбца в панде dataframe - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть фрейм данных с именем data, я пытаюсь очистить один из столбцов в фрейме данных, чтобы я мог преобразовать цену только в числовые значения.Вот как я фильтрую столбец, чтобы найти эти неправильные значения.data[data['incorrect_price'].astype(str).str.contains('[A-Za-z]')]

    Incorrect_Price    Occurences   errors
23  99 cents                732       1
50  3 dollars and 49 cents  211       1
72  the price is 625        128       3
86  new price is 4.39       19        2
138 4 bucks                 3         1
199 new price 429           13        1
225 price is 9.99           5         1
240 new price is 499        8         2  

Я пытался data['incorrect_Price'][20:51].str.findall(r"(\d+) dollars") и data['incorrect_Price'][20:51].str.findall(r"(\d+) cents") найти строки, в которых есть "центы" и "доллары", чтобы я мог извлечь сумму в долларах и центах, но не былвозможность включить это при переборе всех строк в кадре данных.

  I would like the results to like look this:  

    Incorrect_Price        Desired    Occurences    errors
23  99 cents                .99           732         1
50  3 dollars and 49 cents  3.49          211         1
72  the price is 625        625           128         3
86  new price is 4.39       4.39           19         2
138 4 bucks                 4.00           3          1
199 new price 429           429            13         1
225 price is 9.99           9.99           5          1
240 new price is 499        499            8          2

1 Ответ

0 голосов
/ 02 февраля 2019

Задача может быть относительно легко решена, если строки 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? является необязательным множественным числом 'центов с ' или 'долларовых с '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...