Извлечение рациона в два столбца из текстового столбца. - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть датафрейм:

df = pd.DataFrame({"id": [1,2,3,4,5],
                "text": ["This is a ratio of 13.4/10","Favorate rate of this id is 11/9","It may not be a good looking person. But he is vary popular (15/10)","Ratio is 12/10","very popular 17/10"],
                "name":["Joe","Adam","Sara","Jose","Bob"]})

, и я хочу извлечь цифры в два столбца, чтобы получить результат ниже:

df = pd.DataFrame({"id": [1,2,3,4,5],
                "text": ["This is a ratio of 13.4/10","Favorate rate of this id is 11/9","It may not be a good looking person. But he is vary popular (15/10)","Ratio is 12/10","very popular 17/10"],
                "name":["Joe","Adam","Sara","Jose","Bob"],
                "rating_nominator":[13.4,11,15,12,17],
                "rating_denominator":[10,9,10,10,10]})

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете использовать

df[['rating_nominator', 'rating_denominator']] = df['text'].str.extract('(-?\d+(?:\.\d+)?)/(-?\d+(?:\.\d+)?)').astype(float)

Регулярное выражение (-?\d+(?:\.\d+)?)/(-?\d+(?:\.\d+)?) будет захватывать целые числа или числа с плавающей запятой в качестве знаменателя или знаменателя.

( edit : регулярное выражениев этот ответ охватывает больше случаев. Я сделал некоторые предположения, например, что вы не найдете одинарных + знаков в своих числах.)

Демонстрация:

>>> df
   id                  text
0   1  foo 14.12/10.123 bar
1   2                 10/12
2   3             13.4/14.5
3   4          -12.24/-13.5
4   5                1/-1.2
>>>
>>> df[['rating_nominator', 'rating_denominator']] = df['text'].str.extract('(-?\d+(?:\.\d+)?)/(-?\d+(?:\.\d+)?)').astype(float)
>>> df
   id                  text  rating_nominator  rating_denominator
0   1  foo 14.12/10.123 bar               14.12            10.123
1   2                 10/12               10.00            12.000
2   3             13.4/14.5               13.40            14.500
3   4          -12.24/-13.5              -12.24           -13.500
4   5                1/-1.2                1.00            -1.20
0 голосов
/ 06 декабря 2018

Общий шаблон, который вы ищете, соответствует (some number)/(other number).Сопоставление чисел с плавающей точкой - непростая задача, и на SO есть множество ответов, которые отвечают на этот вопрос, так что вы можете воспользоваться этим здесь.

Довольно здравое выражение, взятое из , этот вопрос - ([+-]?(?:[0-9]*[.])?[0-9]+).Вы можете использовать это вместе с Series.str.extract и f-строками:

fpr = r'([+-]?(?:[0-9]*[.])?[0-9]+)'

res = df.text.str.extract(fr'{fpr}\/{fpr}').astype(float)

      0     1
0  13.4  10.0
1  11.0   9.0
2  15.0  10.0
3  12.0  10.0
4  17.0  10.0

Чтобы назначить это вашему DataFrame:

df[['rating_nominator', 'rating_denominator']] = res

   id                                               text  name  rating_nominator  rating_denominator
0   1                         This is a ratio of 13.4/10   Joe              13.4                10.0
1   2                   Favorate rate of this id is 11/9  Adam              11.0                 9.0
2   3  It may not be a good looking person. But he is...  Sara              15.0                10.0
3   4                                     Ratio is 12/10  Jose              12.0                10.0
4   5                                 very popular 17/10   Bob              17.0                10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...