从包含数字,非数字然后是数字的字符串中提取第一个数字序列

时间:2019-02-08 14:59:13

标签: python-3.x string pandas split

我在Pandas数据框中有一个列,其中包含以下值:

111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA

我只需要提取每行中的第一个数字序列-而不是该行中的所有数字。因此输出如下:

111042345
111042345 
110374217 
109202817

我认为实现此目标的最佳方法是将字符串按数字分割并返回,但这会在非数字字符之后给我多余的数字。

3 个答案:

答案 0 :(得分:3)

str.extract与正则表达式\d一起使用以提取数字,{,5}表示前5位数字,+表示所有数字:

df['first_5_digits'] = df['Col'].str.extract('(\d{,5})')
df['all_digits'] = df['Col'].str.extract('(\d+)')
print (df)
                       Col first_5_digits all_digits
0              111042345--          11104  111042345
1                111042345          11104  111042345
2    110374217dclid=CA-R3K          11037  110374217
3  109202817lciz@MM10082IA          10920  109202817

也可以像@ Jon Clements指出的那样通过索引提取N个值:

df['first_5_digits'] = df['Col'].str.extract('(\d+)').str[:5]

答案 1 :(得分:1)

您可以通过应用itertools.takewhile来解决此问题:

在大熊猫中:

data = """111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA""".split()

import pandas as pd
from itertools import takewhile

df = pd.DataFrame(data)

df["numbers"] = df[0].apply(lambda x:''.join(takewhile(str.isdigit,x)) )
print(df)

输出(熊猫):

                         0    numbers
0              111042345--  111042345
1                111042345  111042345
2    110374217dclid=CA-R3K  110374217
3  109202817lciz@MM10082IA  109202817

对于普通列表:

data = """111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA""".split()

print(data)

from itertools import takewhile

d = [ ''.join(takewhile(str.isdigit,text)) for text in data]

print(d)

输出(简单列表):

# splitted data
['111042345--', '111042345', '110374217dclid=CA-R3K', '109202817lciz@MM10082IA']

# itertools.takewhile
['111042345', '111042345', '110374217', '109202817']

边缘情况:


Scott Boston建议,因为效率更高:

df["faster numbers"] = [''.join(takewhile(str.isdigit,i)) for i in df[0]]´

(类似输出-其他列标题)

答案 2 :(得分:0)

可以使用正则表达式解决

import re
data = """111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA""".split()
output = "\n".join([re.findall('\d+', str(d))[0] for d in data])
print(output)

输出:

111042345
111042345
110374217
109202817