从不在任何其他数字之前或之后的pandas字符串列中提取最多N位数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从不在任何其他数字之前或之后的pandas字符串列中提取最多N位数相关的知识,希望对你有一定的参考价值。

python python-3.x pandas我对这个混合的String数据感到头疼。我在数据中有一个带有混合字母数字,文本,数字字符和长整数的数据。

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

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

如果它的字母数字字符如1-HRCC,455-HRCC,它应该只从中选择数值(它应该只限于<= 999)。如果只有数字存在,它应该复制相同的数字,但仅当数字<= 999时。例如45,90,888,999给出相同数字的输出,但如果数字> 999,则应将这些值输出为1.如果存在任何空白,则应保持与空白相同。如果任何文本字符如abc,def,ghi,柱式磨等应输出为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)

Mixed_String(输入),输出

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。

答案

您可以使用像(?<!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

以上是关于从不在任何其他数字之前或之后的pandas字符串列中提取最多N位数的主要内容,如果未能解决你的问题,请参考以下文章

仅对带有 Pandas 的字符串列应用转换,忽略数字数据

如何替换 Pandas 数据框的字符串列中的文本?

删除 Pandas 中字符串列中的 Dash/Dots 并将其替换为 Null

从 pandas DataFrame 中的多个字符串列中删除子字符串

在pandas中提取包含多行和多列的JSON字符串列的部分

如何在条件与数字之间使用 Oracle 中的字符串列