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',' ','[email protected]','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
[email protected],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',' ','[email protected]','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 [email protected] 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