使用python和regex从字符串格式的浮点数中删除第二个小数点

时间:2019-07-07 16:05:32

标签: python regex pandas

我正在使用python和pandas并有一个dataframe列 包含一个字符串。我想将浮点数保留在字符串内并摆脱'-'。在浮点数(字符串)的末尾。

到目前为止,我一直在下面使用一个正则表达式来摆脱原始字符串中的字符和方括号,但它留下了其他任何'-'和'。'

示例字符串:

“ 14,513.045与安装要求不兼容”, 给出: “ 14,513.045-”。 (正数字符串示例)

我也想要负数为: “ -234.670”

字符串中的第一个'-'表示负浮点数。我想保留第一个“-”和第一个“”。和“逗号”。

以下代码:

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

给我留下“ 14,513.045-”。

我看不到使用pandas进行上述操作的方法,并且发现正则表达式是推荐的方法

2 个答案:

答案 0 :(得分:0)

您不需要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

答案 1 :(得分:0)

不要删除不需要的字符,只需指定要查找和提取的模式即可。它应该不那么容易出错。 您要提取一个可以为浮点数的正数和负数:

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

我将其分为三行,向您展示其逻辑遵循方式。希望这是有道理的。

您应将<YOUR_STRING>的值替换为数据的字符串表示形式。至于如何从Pandas DataFrame中获取字符串值,this question可能对此有一些答案。我不确定您的DataFrame的实际外观,但是我猜类似df['single_chainage'][0]的东西应该可以工作。基本上,如果您在Pandas中建立索引,它会返回一些特定于Pandas的信息,如果您只想检索字符串本身,则必须明确地指定该字符串。