如何在 python 上将特定数字与文本数据分开

How to separate spesific number from text data on python

我有一个来自 pandas 的数据框:

id     adress

0     Jame Homie Street. N:60 5555242424 La
1     London. 2322325234243 Stw St. N 8 St.bridge
2     32424244234 ddd st. ss Sk. N 63 Manchester
3     Mou st 147 Rochester Liv 33424245223

我想将数字(如 5555242424、2322325234243、32424244234、33424245223)分开并创建一个新功能。

示例输出:

id     adress                                           number

0     Jame Homie Street. N:60 La                      5555242424 
1     London. Stw St. N 8 St.bridge                   2322325234243 
2     ddd st. ss Sk. N 63 Manchester                  32424244234 
3     Mou st 147 Rochester Liv                        3424245223

假设您想要提取第一个 至少 4 位数的数字(因此在您的示例中它会忽略 60、8、63、147),您可以使用:

df_payers["number"] = df_payers["adress"].str.extract("(\d{4,})")
df_payers["adress"] = df_payers["adress"].str.replace("(\d{4,})","",regex=True)

>>> df_payers
   id                           adress         number
0   0      Jame Homie Street. N:60  La     5555242424
1   1   London.  Stw St. N 8 St.bridge  2322325234243
2   2   ddd st. ss Sk. N 63 Manchester    32424244234
3   3        Mou st 147 Rochester Liv     33424245223

列表理解与其他数字的长度为 3。如果你想增加,你可以在那里改变。

df = pd.DataFrame({
    "adress":["Jame Homie Street. N:60 5555242424 La","London. 2322325234243 Stw St. N 8 St.bridge",
    "32424244234 ddd st. ss Sk. N 63 Manchester","Mou st 147 Rochester Liv 33424245223"],
})

cleanedAdress = []
numbers = []
for i in df.values:
    tempSplit = i[0].split()
    numericEx = [s for s in tempSplit if s.isdigit() if len(s) > 3]
    strEx = ''.join(numericEx)
    numbers.append(strEx)

    tempSplit.remove(strEx)
    tempSplit = ' '.join(tempSplit)
    cleanedAdress.append(tempSplit)

dfCleaned = pd.DataFrame({"adress":cleanedAdress,"numbers":numbers})

dfCleaned

                           adress        numbers
0      Jame Homie Street. N:60 La     5555242424
1   London. Stw St. N 8 St.bridge  2322325234243
2  ddd st. ss Sk. N 63 Manchester    32424244234
3        Mou st 147 Rochester Liv    33424245223

如果您知道所有地址模式,您可以使用一些正则表达式来提取值。

由于在示例中您提供的每一行都与其他行完全不同,因此您可以做的是依靠地址编号长度来构建单个正则表达式,然后将其与其余部分分开。

import re

raw_addrs = """0     Jame Homie Street. N:60 5555242424 La
1     London. 2322325234243 Stw St. N 8 St.bridge
2     32424244234 ddd st. ss Sk. N 63 Manchester
3     Mou st 147 Rochester Liv 33424245223""".split('\n')

id_addrs_regex = r'^(?P<id>\d+)\s+(?P<addr>.*)$'
id_addrs = [(match.group('id'), match.group('addr')) for match in data]

number_re = r'\d{6,}'
numbers = [re.search(number_re, addr).group() for _, addr in id_addrs]

output = [(id_addr[0], ' '.join(id_addr[1].replace(number, "").split()), number) for id_addr, number in zip(id_addrs, numbers)]

输出为:

[('0', 'Jame Homie Street. N:60 La', '5555242424'),
 ('1', 'London. Stw St. N 8 St.bridge', '2322325234243'),
 ('2', 'ddd st. ss Sk. N 63 Manchester', '32424244234'),
 ('3', 'Mou st 147 Rochester Liv', '33424245223')]

希望对你有帮助,只是一个想法,当然代码可以做得更好。