我在Pandas数据框中有一个列,其中包含以下值:
111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA
我只需要提取每行中的第一个数字序列-而不是该行中的所有数字。因此输出如下:
111042345
111042345
110374217
109202817
我认为实现此目标的最佳方法是将字符串按数字分割并返回,但这会在非数字字符之后给我多余的数字。
答案 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