我想知道如何使用正则表达式删除任何非数字字符,同时只以更有效的方式为系列选择非空和空格(单个值可能包含一个或多个空格)值,
df['numeric_no'] = df['id'].apply(lambda x: re.sub("[^0-9]", "", x))
df = df[(df['numeric_no'] != '') & (df['numeric_no'] != ' ')]
df
numeric_no
B-27000
44-11-E
LAND-11-4
17772A
88LL9A
321LP-3
UNIT 9 CAM -00-12
WWcard_055_34QE
EE119.45
aaa
b b
结果看起来像
numeric_no
27000
4411
114
17772
889
3213
90012
05534
119.45
答案 0 :(得分:1)
我认为str.findall
需要boolean indexing
:
s = df['numeric_no'].str.findall("(\d*\.\d+|\d+)").str.join('')
s = s[s.astype(bool)]
print (s)
0 27000
1 4411
2 114
3 17772
4 889
5 3213
6 90012
7 05534
8 119.45
Name: numeric_no, dtype: object
答案 1 :(得分:1)
您可以匹配并捕获数字并匹配任何其他内容:
(\d+(?:\.\d+)?)|.
然后将匹配替换为$1
(对第一个捕获组的反向引用)
Python代码:
re.sub(r"(\d+(?:\.\d+)?)|.", "$1", x)
答案 2 :(得分:1)
我认为可以尝试:
df.numeric_no.str.extractall('(\d+?[\.\d+])').astype(str).sum(level=0)
输出:
0
0 2700
1 4411
2 11
3 1777
4 88
5 32
6 0012
7 0534
8 119.45