Извлечение до N цифр из столбца строки панды, не предшествующего или не замененного другими цифрами - PullRequest
0 голосов
/ 26 декабря 2018

python python-3.x pandas У меня немного болит голова от этих смешанных строковых данных.У меня есть данные со смешанными буквенно-цифровыми, текстовыми, числовыми символами и длинными целыми числами в данных.

Можете ли вы помочь мне решить мою проблему?

Здесь логика заключается в том, что в этой смешанной строке, необходимо применить следующую логику,

Если ее буквенно-цифровой символ, такой как 1-HRCC, 455-HRCC, он должен выбирать из него только числовые значения (он должен ограничиваться только <= 999).если присутствуют только числа, он должен повторять одно и то же число, но только если числа <= 999.например, 45,90, 888,999, чтобы дать вывод того же числа, но если число> 999, оно должно вывести эти значения как 1. если присутствуют какие-либо пробелы, оно должно оставаться таким же, как и пустое.если какие-либо текстовые символы, такие как abc, def, ghi, pillar mill и т. д., должны выводиться как 1. Любые числа 123 678984 или буквенно-цифровые символы с пробелом (ahd 233 xyz) также должны выводиться как 1. Я определил функцию ниже, так как я все еще вНа этапе обучения не уверены, как этого добиться.

import pandas as pd

df= pd.DataFrame({'Callback':['1-HRCC','Pilar Mill',' ','abc',' ','Kar.J.Kueger@xxx.com','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 (Input), Output

1-HRCC,1
Pilar Mill,1
abc,1
Kar.J.Kueger@xxx.com,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.

1 Ответ

0 голосов
/ 24 марта 2019

Вы можете использовать регулярное выражение, например (?<!\d)(\d{1,3})(?!\d), чтобы сопоставить любой трехзначный блок, не заключенный в цифры.Во-первых, проверьте, не является ли строка пустой, если это так, результатом должна быть пустая строка.Иначе, получите значение соответствия регулярному выражению или 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',' ','Kar.J.Kueger@xxx.com','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   Kar.J.Kueger@xxx.com    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...