Извлечение первой последовательности цифр из строки, содержащей цифры, не цифры, а затем цифры - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть столбец в кадре данных Pandas, который содержит значения следующим образом:

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

Мне нужно извлечь только первую последовательность цифр в каждой строке, а не все цифры в строке.Таким образом, результат будет выглядеть следующим образом:

111042345
111042345 
110374217 
109202817

Я подумал, что лучший способ достичь этого - разделить строки на цифры и вернуть их, но это даст мне ненужные цифры после нецифровых символов.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы можете решить эту проблему, применив 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']

Пограничный регистр:


Предложено Скоттом Бостоном , потому что более эффективно:

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

(Аналогичный вывод - заголовок другого столбца)

0 голосов
/ 08 февраля 2019

Это можно решить с помощью регулярных выражений:

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
0 голосов
/ 08 февраля 2019

Используйте 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

Like @ JonУказанный климент также возможен для извлечения N значений путем индексации:

df['first_5_digits'] = df['Col'].str.extract('(\d+)').str[:5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...