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。
答案 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