首页 > 解决方案 > 根据从模式派生的条件替换列中的值(如果需要,可能是正则表达式)

问题描述

我有一列家庭地址,需要根据几种模式“清理”和预处理。例如:

在此处输入图像描述

我做了以下事情:

import pandas as pd
import re

df = pd.read_csv("SampleData.csv")
df['Address'] = (df['Address'].str.split()).str.join(' ')
df.head(10)

索引 1,显示地址“ 9 (4f7) Adam Road”。只关注“ (4f7)”它提供的模式是空格、括号、整数、字符、括号、空格。

这个地址的输出应该是“ 9/4 Adam Road”。因此,我需要仔细选择括号内的第一个整数,并将其放在地址行中第一个出现的整数旁边(带有正斜杠)。

第二个例子是“ 1 (Flat 12) Subang Heights, Slateford,

第二个例子的输出应该是:“ 1/12 Subang Heights, Slateford”。在这里,我必须删除单词 Flat 并将整数 12 放在第一个出现的整数旁边。出现的逗号和符号也需要删除。

解决这个问题的最佳建议是什么?它应该是正则表达式还是任何其他适用的 Python 技术?

有处理此类模式经验的人可以帮助我吗?

更新 1(使用的数据):

18/8 Andy Pitt Drive
9 (4f7) Adam Road
2nd Floor, 12 China Town
1 Kuala Lumpur Park
23 KingsRoad North
81 (5F2) Prince Street
45/2 Brian's Court
1/2 Ships Corner
9/1 Eagle's Eye
1 (Flat 12) Subang Heights, Slateford,

标签: pythonregexstringsymbols

解决方案


您可以使用此正则表达式捕获两组中的第一个数字和第二个数字以及第三组中剩余的字母地址,

^(\d+)\D+(\d+).*?\s+([a-zA-Z]+.*?)\W*$

并将所有内容替换为\1/\2 \3

演示

如果您遇到任何样本问题,请告诉我,我会根据需要改进正则表达式。当您将它们作为图像发布时,很难使用您的示例数据。请避免以图片和文字形式发布。

示例 Python 代码,

import re

arr = ["18/8 Andy Pitt Drive","9 (4f7) Adam Road","2nd Floor, 12 China Town","1 Kuala Lumpur Park","23 KingsRoad North","81 (5F2) Prince Street","45/2 Brian's Court","1/2 Ships Corner","9/1 Eagle's Eye","1 (Flat 12) Subang Heights, Slateford,"]

for s in arr:
 print(s, '-->', re.sub(r'^(\d+)\D+(\d+).*?\s+([a-zA-Z]+.*?)\W*$', r'\1/\2 \3', s))

印刷,

18/8 Andy Pitt Drive --> 18/8 Andy Pitt Drive
9 (4f7) Adam Road --> 9/4 Adam Road
2nd Floor, 12 China Town --> 2/12 China Town
1 Kuala Lumpur Park --> 1 Kuala Lumpur Park
23 KingsRoad North --> 23 KingsRoad North
81 (5F2) Prince Street --> 81/5 Prince Street
45/2 Brian's Court --> 45/2 Brian's Court
1/2 Ships Corner --> 1/2 Ships Corner
9/1 Eagle's Eye --> 9/1 Eagle's Eye
1 (Flat 12) Subang Heights, Slateford, --> 1/12 Subang Heights, Slateford

推荐阅读