Удаление второй десятичной точки из числа с плавающей точкой в ​​строковом формате с использованием Python и регулярных выражений - PullRequest
1 голос
/ 07 июля 2019

Я использую python и pandas и у меня есть столбец dataframe, который содержит строку.Я хочу сохранить число с плавающей запятой внутри строки и избавиться от '-.'в конце float (string).

До сих пор я использовал регулярное выражение ниже, чтобы избавиться от символов и скобок из исходной строки, но оно оставляет любые другие '-' и '.'

Пример строки:

"14 513,045 Не соответствует требованию установки", дает: "14 513,045-."(пример строки с положительным числом)

Я также хочу, чтобы отрицательное число было следующим: "-234.670"

Первый '-' в строке предназначен для отрицательного числа с плавающей запятой.Я хотел бы оставить первое «-» и «первое».и 'запятая'.

Код ниже:

dataframe3['single_chainage2'] = dataframe3['single_chainage'].str.replace(r"[a-zA-Z*()]",'')

Оставляет меня с "14,513.045-".

Я не видел способа сделать это с помощью панд и увидел, что регулярное выражение было рекомендовано

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Вместо того, чтобы удалять ненужные символы, просто укажите шаблон, который вы хотите найти, и извлеките его.Это должно быть гораздо менее подвержено ошибкам.Вы хотите извлечь положительное и отрицательное число, которое может быть плавающей точкой:

import re
number_match = re.search("[+-]?(\d+,?)*(\.\d+)?", 'Your string.')
number = number_match.group(0)

Тестирование кода выше:

test_string_positive='14,513.045Non-compliant with installation req.'
test_string_negative='-234.670Non-compliant with installation req.'

In [1]: test=re.search("[+-]?(\d+,?)*(\.\d+)?",test_string_positive)

In [2]: test.group(0)
Out[2]: '14,513.045'

In [3]: test=re.search("[+-]?(\d+,?)*(\.\d+)?",test_string_negative)

In [4]: test.group(0)
Out[4]: '-234.670'

С этим решением вы не хотите делать замену, новместо этого просто присвойте значение соответствия регулярному выражению.

number_match = re.search("[+-]?(\d+,?)*(\.\d+)?", <YOUR_STRING>)
number = number_match.group(0)
dataframe3['single_chainage2'] = number

Я разделил это на 3 строки, чтобы показать вам, как оно логически следует.Надеюсь, это имеет смысл.

Вы должны заменить значение <YOUR_STRING> строковым представлением данных.Что касается того, как извлечь строковое значение из Pandas DataFrame, этот вопрос может иметь некоторые ответы на это.Я не уверен в том, как на самом деле выглядит ваш DataFrame, но думаю, что-то вроде df['single_chainage'][0] должно работать.В основном, если вы индексируете в Pandas, он возвращает некоторую специфическую информацию для Pandas, и если вы хотите получить только саму строку, вы должны указать это явно.

0 голосов
/ 07 июля 2019

Вам не нужно replace, я думаю, что вы можете использовать Series.str.extract вместо того, чтобы получить нужную вам строку.

In [1]: import pandas as pd                                                                                                                                     

In [2]: ser = pd.Series(["14,513.045Non-compliant with installation req.", "14,513.045- .", "-234.670"])                                                        

In [3]: pat = r'^(?P<num>-?(\d+,)*\d+(\.\d+)?)'

In [5]: ser.str.extract(pat)['num']                                                                                                                             
Out[5]: 
0    14,513.045
1    14,513.045
2      -234.670
Name: num, dtype: object

и именованная группа необходима в шаблоне регулярных выражений (num в этом примере).

и при необходимости преобразовать его в числовой тип dtype:

In [7]: ser.str.extract(pat)['num'].str.replace(',', '').astype(float)                                                                                          
Out[7]: 
0    14513.045
1    14513.045
2     -234.670
Name: num, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...