如何在pandas中使用regex拆分字符串地址列

2024-05-20 19:22:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧,其中包含address

df = pd.DataFrame(index=np.arange(10))
df["address"] = "Iso Omena 8 a 2"

需要将其拆分为不同的列,以便生成的数据帧如下所示:

^{pr2}$

让它变得棘手的是:

1.名字之间可以有空格也可以没有空格,就像上面的例子一样。在

2.门牌号码字母有时可能是数字而不是字母。(例如“Iso Omena 8 5 2”)

address最完整的形式是:【地址、街道名称、楼号、门牌号、字母、公寓号】


Tags: 数据dataframedfindexaddressnp字母iso
3条回答

this答案中获得一些灵感,我想出了这个regex+提取解决方案:

In [77]: df.address.iloc[1] = 'Big Apple 19 21 7'

In [78]: df.address.str.extract('(?P<street>^[^0-9]*) (?P<building>.+?) (?P<door>.+?) (?P<apartment>.+?$)')

Out[78]: 
  street building door apartment
0  Iso Omena        8    a         2
1  Big Apple       19   21         7    
2  Iso Omena        8    a         2
3  Iso Omena        8    a         2 
4  Iso Omena        8    a         2
5  Iso Omena        8    a         2
6  Iso Omena        8    a         2
7  Iso Omena        8    a         2
8  Iso Omena        8    a         2
9  Iso Omena        8    a         2

您可以使用:

In [116]: s1 = df.address.str.findall(r'([\w ]+?) +(\d+) +([\d\w]+) +(\d+)').map(lambda s: s[0])

In [117]: s1
Out[117]: 
0    (Iso Omena, 8, a, 2)
1    (Iso Omena, 8, a, 2)
2    (Iso Omena, 8, a, 2)
3    (Iso Omena, 8, a, 2)
4    (Iso Omena, 8, a, 2)
5    (Iso Omena, 8, a, 2)
6    (Iso Omena, 8, a, 2)
7    (Iso Omena, 8, a, 2)
8    (Iso Omena, 8, a, 2)
9    (Iso Omena, 8, a, 2)
Name: address, dtype: object

然后基于这些列构造一个数据帧:

^{pr2}$

假设地址仅为字母和空格,其余为空格分隔,而建筑编号总是以数字开头,这可以通过以下方式实现:

import re
s = ['Iso Omena 8 a 2', 'Xstreet 2', 'Isö Ømenå 8 a 2']
for addr in s:
    street = re.findall('[^\d]*', addr)[0].strip()
    rest = addr[len(street):].strip().split(' ')
    print(street, rest)

# Iso Omena ['8', 'a', '2']
# Xstreet ['2']
# Isö Ømenå ['8', 'a', '2']

或者,如果您希望将所有内容都放在一个数据帧中:

^{pr2}$

编辑:建筑物编号只在“-”符号的左边:

您可以将df.loc[i,(col)] = val替换为

df.loc[i,(col)] = re.findall('[^-]*', val)[0]

如果这也适合门和公寓。否则,您必须使用col=='building'进行测试,才能使用此版本。在

相关问题 更多 >