Python 如何正确地标准化地址类型

Python 如何正确地标准化地址类型,python,replace,Python,Replace,我正试图通过将缩写词转换成完整的单词来标准化街道地址(例如RD-Road)。我创建了许多行来解释不同的拼写,并遇到了一个问题,其中一个替换代码覆盖了另一个 import pandas as pd mydata = {'Street_type': ['PL', 'pl', 'Pl', 'PLACE', 'place']} mydata = pd.DataFrame(mydata) mydata['Street_type'] = mydata['Street_type'].replace('P

我正试图通过将缩写词转换成完整的单词来标准化街道地址(例如RD-Road)。我创建了许多行来解释不同的拼写,并遇到了一个问题,其中一个替换代码覆盖了另一个

import pandas as pd 

mydata = {'Street_type': ['PL', 'pl', 'Pl', 'PLACE', 'place']}
mydata = pd.DataFrame(mydata)

mydata['Street_type'] = mydata['Street_type'].replace('PL','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('pl','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('Pl','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('PLACE','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('place','Place',regex=True)

我得到了Placeace,而不是Placeace。避免此错误的最佳方法是什么?我是否编写if-else语句或任何函数?提前谢谢

在其他问题中,存在重叠逻辑:在替换目标(“旧”)字符串之前,无法检查其是否为完整单词。例如,使用输入类型“PLACE”,可以触发第一次和第三次替换,在达到所需条件之前生成
PlaceACE
,然后生成
PlaceACE

您需要仔细检查跟踪和排除逻辑,然后只应用其中一个替换。您可以检查street_类型的长度,并为该长度应用所需的唯一过渡

如果您试图转换
case
语句,那么您需要遵循该逻辑模式,而不是您编写的后续应用程序。您可以很容易地查找如何在Python中模拟“case”语句

也可考虑使用翻译词典,如

type_trans = {
    "pl":    "Place",
    "Pl":    "Place",
    "PLACE": "Place",
    ...
}
那么你的变化很简单

mydata['Street_type'] = type_trans[mydata['Street_type']]
此外,还可以在元组中列出所有变量,例如:

type_place = ("PL", "Pl", "pl", "PLACE", "place")
if mydata['Street_type'] in type_place
mydata['Street_type'] = "Place"

。。。但是,请确保对整个街道类型列表进行适当的概括。

除其他问题外,还存在重叠逻辑:在替换目标(“旧”)字符串之前,无法检查其是否为完整单词。例如,使用输入类型“PLACE”,可以触发第一次和第三次替换,在达到所需条件之前生成
PlaceACE
,然后生成
PlaceACE

您需要仔细检查跟踪和排除逻辑,然后只应用其中一个替换。您可以检查street_类型的长度,并为该长度应用所需的唯一过渡

如果您试图转换
case
语句,那么您需要遵循该逻辑模式,而不是您编写的后续应用程序。您可以很容易地查找如何在Python中模拟“case”语句

也可考虑使用翻译词典,如

type_trans = {
    "pl":    "Place",
    "Pl":    "Place",
    "PLACE": "Place",
    ...
}
那么你的变化很简单

mydata['Street_type'] = type_trans[mydata['Street_type']]
此外,还可以在元组中列出所有变量,例如:

type_place = ("PL", "Pl", "pl", "PLACE", "place")
if mydata['Street_type'] in type_place
mydata['Street_type'] = "Place"

。。。但是,请确保对整个街道类型列表进行适当的概括。

如果您在此处使用适当的正则表达式,则只需一次即可正确完成此操作,例如使用单词边界(\b):


如果在此处使用适当的正则表达式,例如使用单词边界(\b),则只需一次通过即可正确执行此操作:

#needermanwunch
def零(形状):
retval=[]
对于范围内的x(形状[0]):
retval.append([])
对于范围内的y(形状[1]):
retval[-1]。追加(0)
返回返回
比赛奖=10
错配惩罚=-3
差距(u)惩罚=-4(无论是开局还是开局)
def匹配_分数(α、β):
如果α=β:
返回比赛奖
elif alpha='-'或beta='-':
返回间隙(u)惩罚
其他:
回报率与违约金
def最终确定(校准1、校准2):
align1=align1[:-1]#倒序1
align2=align2[:-1]#倒序2
i、 j=0,0
#计算身份、分数和对齐顺序
符号=“”
找到=0
分数=0
标识=0
对于范围(0,len(align1))中的i:
#如果两个AAs相同,则输出字母
如果align1[i]==align2[i]:
symbol=symbol+align1[i]
标识=标识+1
分数+=匹配分数(对齐1[i],对齐2[i])
#如果它们不相同,并且没有一个是gap
elif align1[i]!=align2[i]和align1[i]!='-'和align2[i]!='-':
分数+=匹配分数(对齐1[i],对齐2[i])
符号+=“”
找到=0
#如果其中一个是间隙,则输出一个空格
elif align1[i]='-'或align2[i]='-':
符号+=“”
分数+=差距\处罚
标识=浮动(标识)/len(对齐1)*100
打印('Similarity=',%3.3f”%identity,'percent')
打印('分数=',分数)
#打印(对齐1)
#印刷品(符号)
#打印(对齐2)
def针(序号1、序号2):
m、 n=len(seq1),len(seq2)#两个序列的长度
#生成DP表和回溯路径指针矩阵
分数=零((m+1,n+1))#DP表
#计算DP表
对于范围(0,m+1)内的i:
分数[i][0]=差距(罚分)*i
对于范围(0,n+1)内的j:
分数[0][j]=差距_处罚*j
对于范围(1,m+1)内的i:
对于范围(1,n+1)内的j:
匹配=分数[i-1][j-1]+匹配分数(序号1[i-1],序号2[j-1])
删除=得分[i-1][j]+差距处罚
插入=得分[i][j-1]+差距惩罚
分数[i][j]=最大值(匹配、删除、插入)
#回溯并计算对齐
align1,align2='''''
i、 j=m,n#从右下角单元格开始
当i>0和j>0时:#结束于顶部或左侧边缘
分数\当前=分数[i][j]
分数=分数[i-1][j-1]
分数=分数[i][j-1]
分数=分数[i-1][j]
如果当前得分==对角线得分+匹配得分(序号1[i-1],序号2[j-1]):
align1+=seq1[i-1]
align2+=seq2[j-1]
i-=1
j-=1
elif分数\当前==分数\左+差距\惩罚:
align1+=seq1[i-1]
align2+='-'
i-=1
elif分数=当前分数==分数+差距惩罚:
align1+='-'
align2+=seq2[j-1]
j-=1
#完成到左上角单元格的跟踪
当i>0时:
align1+=seq1[i-1]
align2+='-'
i-=1
当j>0时:
align1+='-'
艾尔