使用正则表达式

时间:2018-08-01 20:46:25

标签: python regex pandas dataframe

我正在使用其中一列中包含非数值的pandas数据框。有没有办法我只能在保留列中的数字的同时替换字符。将正则表达式模式用于清理数据和非常感谢有人能指出我正确的正则表达式模式。

最终输出必须是[0-9]。[0-9]类型的单位浮点数,但是有些值也不会遵循这些标准,因此我需要找到这些数字然后进行缩放

例如:

Col A

'7.8.',
'5..3',
'%3.2',
'   ',
'3.*8',
'3.8*',
'140',
'14.5 of HGB',
'>14.5',
'<14.5',
'14,5'
'14. 5'

预期输出:

Col A

'7.8',
'5.3',
'3.2',
'0',
'3.8',
'3.8',
'140',
'14.5',
'14.5',
'14.5',
'14.5',
'14.5'

P.S。目的是仅提取数字,然后将其转换为浮点数,以便我可以对其进行一些计算。

谢谢

阿卜杜勒

2 个答案:

答案 0 :(得分:1)

正则表达式将“。”两侧的数字分组。忽略所有非数字。该代码使用这些组来创建所需的输出。 Regex101

import pandas as pd

def clean_input(m):
    print(m.group(0))
    if m:
        val = m.group(1)
        if m.group(2):
            val = val + '.' +m.group(2)
    return val

a = pd.DataFrame({'colA':
   ['7.8.',
    '5..3',
    '%3.2',
    '   ',
    '3.*8',
    '3.8*',
    '140',
    '5.5.',
    '14.5 of HGB',
    '>14.5',
    '<14.5',
    '14,5',
   '14. 5']})
a['colA'].str.replace('[^\d]*(\d+)[^\d]*(?:\.)?[^\d]*(\d)*[^\d]*', clean_input)

输出:

0      7.8
1      5.3
2      3.2
3         
4      3.8
5      3.8
6      140
7      5.5
8     14.5
9     14.5
10    14.5
11    14.5
12    14.5

正则表达式说明:

  • \d-匹配一个数字
  • [^<pattern>]-匹配除  
  • [^\d]-匹配除数字以外的任何字符。
  • [^\d]+-匹配上述一项或多项。
  • (?:)-是不捕获匹配字符的非捕获组。
  • <pattern>?-模式零次或一次。
  • \.-由于.是一个元字符,因此必须使用\进行转义

答案 1 :(得分:0)

另一种方法:将字符串按句点分隔,从第一个和第二个片段中提取所有数字,并用句点将它们连接起来。

parts = df['colA'].str.split('\.')
part0 = parts.str[0].str.extract('(\d+)').fillna('0')
part1 = parts.str[1].str.extract('(\d+)').fillna('0')
part0 + "." + part1

输出:

#0    7.8
#1    5.0
#2    3.2
#3    0.0
#4    3.8
#5    3.8
#6  140.0