关于地址的中文部分转成数字

最近使用pandas 在处理地址遇到了一些小瓶颈
资料在dataframe里面
以下是我做测试的
资料来源有路名,门牌号码,楼层 …

dataframe其中的资料
“中区三民路二段105号三楼之4”
预期的结果是需要
“中区三民路2段105号3楼之4”
路名的部分不须转成数字

import pandas as pd

data = {"地址":["中区三民路二段105号三楼之4"]}  
df = pd.DataFrame(data)

num_zh =['一','二','三','四','五','六','七','八','九','十']
num_map = [i for i in range(1,11,1)]
num_dict = dict(zip(num_zh,num_map))
def Con_to_num(value):
    print(value)
    tmp_list = []
    if len(value) == 0:
        return "0"
    else:
        for i in value:
            if len(i) == 1:
                tmp_list.append(str(num_dict[i]))
            elif len(i) == 2:
                if i[0] == '十':
                    tmp_list.append(str(10 + num_dict[i[1]]))
                else:
                    tmp_list.append(str(num_dict[i[0]] * 10))
            elif len(i) == 3:
                    tmp_list.append(str(num_dict[i[0]] * 10 +num_dict[i[2]]))
        print(tmp_list)
        return tmp_list


df['地址'] = df['地址'].str.findall("[十一二三四五六七八九]").map(Con_to_num)

代码输出结果
[‘三’, ‘二’, ‘三’]
[‘3’, ‘2’, ‘3’]
这是回传的 没有想法该如何将原始资料替换上去
也测试过datafram.replace([“三”,”3”],[“二”,”2”])
不知道该如何修改成单一字元匹配

也有尝试过

df_Comparison['号'] =  df_Comparison['号'].str.replace(df_Comparison['号'].str.findall("[一二三四五六七八九十]+"),df_Comparison['号'].str.findall("[一二三四五六七八九十]+").map(Con_to_num))
#会报以下错误
repl must be a string or callable

#后面将单一笔地址用同样的方式也是会报错

感谢各位

Jason990420
最佳答案

Another script for it.

import re

def repl(match):
    value = 0
    for char in match.group():
        if char == '十':
            value = value*10 if value else 10
        else:
            value += "一二三四五六七八九".index(char) + 1
    return str(value)

text = "中区三民路十二段105号三十楼之4"
regex = re.compile(r"""([一二三四五六七八九十]+)(?=[段号楼])""")
result = regex.sub(repl, text)

print(result)
中区三民路1210530楼之4
1个月前 评论
a1016233 (楼主) 1个月前
讨论数量: 4
bouc

不了解 pandas, 不过从逻辑上可以提供一点思路. 你的目的是把数字对应的汉字改成数字, 但是排除 xx路, 这个可以用正则表达式匹配出来. 将要处理的数据作为字符串展示:

import re

data = "中区三民路二段105号三楼之4"
patts = "一二三四五六七八九十"  # 字符串用来搜索汉字

def pat_to_num(matchobj):
    return str(patts.find(matchobj.group(0)) + 1)  # 查找到的索引 + 1 就是汉字对应的数字, 转换成字符串

re.sub("[一二三四五六七八九十](?!.*路)", pat_to_num, data)
1个月前 评论
a1016233 (楼主) 1个月前
Jason990420

Another script for it.

import re

def repl(match):
    value = 0
    for char in match.group():
        if char == '十':
            value = value*10 if value else 10
        else:
            value += "一二三四五六七八九".index(char) + 1
    return str(value)

text = "中区三民路十二段105号三十楼之4"
regex = re.compile(r"""([一二三四五六七八九十]+)(?=[段号楼])""")
result = regex.sub(repl, text)

print(result)
中区三民路1210530楼之4
1个月前 评论
a1016233 (楼主) 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!