从熊猫字符串列中提取最多N位数字,该数字不得在其他数字之前或之后

时间:2018-12-26 19:12:21

标签: python regex string pandas dataframe

python python-3.x熊猫 对于混合的String数据,我有些头疼。我有一个混合了字母数字,文本,数字字符和长整数的数据。

您能指导我解决我的问题吗?

这里的逻辑是,在此混合字符串中,需要应用以下逻辑,

如果其字母数字字符(例如1-HRCC,455-HRCC),则应仅从中选择数字值(只能限制为<= 999)。 如果仅存在数字,则应该复制相同的数字,但前提是数字小于等于999。例如45,90,888,999给出相同数字的输出,但如果数字> 999,则应将这些值输出为1。 如果存在空白,则应与空白保持相同。 如果任何文本字符(如abc,def,ghi,pill mill等)应输出为1。 任何数字123 678984或带空格(ahd 233 xyz)的字母数字也应输出为1。 我定义了以下功能,因为我仍处于学习阶段,不确定如何实现此功能。

import pandas as pd

df= pd.DataFrame({'Callback':['1-HRCC','Pilar Mill',' ','abc',' ','Kar.J.Kueger@xxx.com','xyz','mc','2-   HRCC','Regional','15','10','2','99-HRCC','43- HRCC','675','888','4-   HRCC','31318697418','30-HRCC','25-HRCC','30-HRCC']})

def reg_clean(s):
    if isinstance(s,str) and s[:0].isdigit():
        return int(''.join(ele for ele in s if ele.isdigit()))
    elif isinstance(s,str) and s=="":
            return ""
#    elif  s[:1].isdigit():?
#            return s
    else:
        return 1
df['Callback1']= df['Callback'].map(reg_clean)

混合字符串(输入),输出

1-HRCC,1
Pilar Mill,1
abc,1
Kar.J.Kueger@xxx.com,1
xyz,1
mc,1
2-HRCC,2
Regional,1
,
15,15
10,10
2,2
99-HRCC,99
,
43-HRCC,43
675,675
888,888
4-HRCC,4
31318697418,1
30-HRCC,30
25-HRCC,25
30-HRCC,30

此处,输出使用逗号分隔。目前,所有结果均为1。

1 个答案:

答案 0 :(得分:0)

您可以使用诸如(?<!\d)(\d{1,3})(?!\d)之类的正则表达式来匹配未用数字括起来的任何3位数字块。首先,检查字符串是否不为空,如果为空,则结果应为空字符串。否则,获取正则表达式匹配值;如果没有匹配项,则获取1

import re
import pandas as pd

regex = re.compile(r'(?<!\d)(\d{1,3})(?!\d)')
def reg_clean(s):
    if not s.strip(): # if strins is not blank
        return ""     # Return empty
    else:
        m = regex.search(s)       # If there is a regex match
        if m:
            return int(m.group()) # return the match value
        else:
            return 1              # Else, return 1

df=pd.DataFrame({'Callback':['1-HRCC','Pilar Mill',' ','abc',' ','Kar.J.Kueger@xxx.com','xyz','mc','2-   HRCC','Regional','15','10','2','99-HRCC','43- HRCC','675','888','4-   HRCC','31318697418','30-HRCC','25-HRCC','30-HRCC']})
df['ext'] = df['Callback'].apply(reg_clean)

输出:

>>> df
                Callback  ext
0                 1-HRCC    1
1             Pilar Mill    1
2                            
3                    abc    1
4                            
5   Kar.J.Kueger@xxx.com    1
6                    xyz    1
7                     mc    1
8              2-   HRCC    2
9               Regional    1
10                    15   15
11                    10   10
12                     2    2
13               99-HRCC   99
14              43- HRCC   43
15                   675  675
16                   888  888
17             4-   HRCC    4
18           31318697418    1
19               30-HRCC   30
20               25-HRCC   25
21               30-HRCC   30