如何在 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')]
希望对你有帮助,只是一个想法,当然代码可以做得更好。
我有一个来自 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')]
希望对你有帮助,只是一个想法,当然代码可以做得更好。