特别推荐 | “正则表达式”在工业企业数据库匹配中的运用(二)
上期,我们主要给大家介绍了“正则表达式”具体用法(点此回顾)。本期,我们将继续探索利用“正则表达式”对工业企业数据库中企业名称进行预处理的应用环节。
统一“企业名称”中英文符号
def punctuation2std(df, col_name, **kwargs):
# 将中文符号转英文符号
# 必要参数 {'col_name':****}
# 可选参数 {'add':{'\s':''}}
punctuation_dict = {
'—': '-' # 8212 -> 45
, ';': ';' # 65307 -> 59
, ':': ':' # 65306 -> 58
, '(': '(' # 65288 -> 40
, ')': ')' # 65289 -> 41
, ',': ',' # 65292 -> 44
, '!': '!' # 65281 -> 33
, '【': '[' # 12304 -> 91
, '】': ']' # 12305 -> 93
, '“': '"' # 8220 -> 34
, '”': '"' # 8221 -> 34
, '‘': '\'' # 8216 -> 39
, '’': '\'' # 8217 -> 39
, '%': '%' # 65285 -> 37
, '﹪': '%' # 65130 -> 37
, '1': '1' # 65297 -> 49
, '2': '2' # 65298-> 50
, '3': '3' # 65299 -> 51
, '4': '4' # 65300 -> 52
, '5': '5' # 65301 -> 53
, '6': '6' # 65302 -> 54
, '7': '7' # 65303 -> 55
, '8': '8' # 65304 -> 56
, '9': '9' # 65305 -> 57
, '0': '0' # 65296 -> 48
}
if 'add' in kwargs:
punctuation_dict.update(kwargs['add'])
for key in punctuation_dict:
df[col_name] = df[col_name].str.replace(key, punctuation_dict[key], regex=True)
return df
In [1]: ord('﹪')
Out[1]: 65130
In [2]: ord('%')
Out[2]: 37
In [3]: chr(65130)
Out[3]: '﹪'
Vectorized string functions for Series and Index. NAs stay NA unless handled otherwise by a particular method. Patterned after Python’s string methods, with some inspiration from R’s stringr package.
”需要注意的是,pandas.Series.str与pandas.Series对象都有replace方法。
In [1]: import pandas as pd
In [2]: ser = pd.Series(['AA', 'BBBBB', 'CCC'])
In [3]: ser.dtype
Out[3]: dtype('O')
In [4]: ser.replace('B', 'D')
Out[4]:
0 AA
1 BBBBB
2 CCC
dtype: object
In [5]: ser.replace('B', 'D', regex=True)
Out[5]:
0 AA
1 DDDDD
2 CCC
dtype: object
In [6]: ser.str.replace('B', 'D')
Out[6]:
0 AA
1 DDDDD
2 CCC
dtype: object
In [7]: ser.str.replace('B', 'D', regex=False)
Out[7]:
0 AA
1 DDDDD
2 CCC
dtype: object
左右滑动查看更多
In [8]: ser.str.replace(r'[B|C]', 'D')
Out[8]:
0 AA
1 DDDDD
2 DDD
dtype: object
In [9]: ser.str.replace(r'[B|C]', 'D', regex=False)
Out[9]:
0 AA
1 BBBBB
2 CCC
dtype: object
In [10]: 'ABCDEFG'.replace('CD', '123')
Out[10]: 'AB123EFG'
左右滑动查看更多
In [1]: ser.str[:3] # 切片
Out[1]:
0 AA
1 BBB
2 CCC
dtype: object
In [2]: ser.str.count('A')
Out[2]:
0 2
1 0
2 0
dtype: int64
企业名称主体部分模糊匹配
res_temp = pd.merge(test_df
, parent_df
, how='left'
, left_on='lookup_name_x'
, right_on='lookup_name_y'
, suffixes=('','[step%s]' %data['i'])
)
exist字段表示这个区的名字以及县码还有没有在被使用
不能使用最新的县码的原因,是因为一个撤销的区内的绝大部分企业都可能沿用之前的区名。
In [1]: '(' + county_code['prov'] + '?)?(' + county_code['city'] + '?)?(' + county_code['county'] + '?)?'
Out[1]:
0 (北京市?)?(北京市?)?(东城区?)?
1 (北京市?)?(北京市?)?(西城区?)?
2 (北京市?)?(北京市?)?(崇文区?)?
3 (北京市?)?(北京市?)?(宣武区?)?
# 以下结果省略
In [2]: '|'.join(set(county_code['prov'].str.replace('(省|市|自治区)', '').tolist()))
Out[2]: '江苏|重庆|广西壮族|安徽|福建|江西|湖北|宁夏回族|海南|山东|贵州|黑龙江|浙江|山西|云南|吉林|青海|河南|广东|内蒙古|西藏|河北|上海|辽宁|陕西|新疆维吾尔|天津|四川|湖南|甘肃|北京'
In [3]: '|'.join((county_code['prov'].drop_duplicates() + '?').tolist())
Out[3]: '北京市?|天津市?|河北省?|山西省?|内蒙古自治区?|辽宁省?|吉林省?|黑龙江省?|上海市?|江苏省?|浙江省?|安徽省?|福建省?|江西省?|山东省?|河南省?|湖北省?|湖南省?|广东省?|广西壮族自治区?|海南省?|重庆市?|四川省?|贵州省?|云南省?|西藏自治区?|陕西省?|甘肃省?|青海省?|宁夏回族自治区?|新疆维吾尔自治区?'
天真!!!
👉省的关键字较少,还能勉强这么处理。但是市、县(区)的名称较多且具有混淆性。如,县码140402代表的是“山西省长治市城区”,县名为“城区”;再如“沁县”中的“县”字,其本身就是县名中的一部分,不能随意去掉。
👉“企业取名”部位,可能含某个市县的名字。例如,湖南长沙市芙蓉区,在工商库里检索企业名称中包含“芙蓉”两字且不属于长沙市内的企业,约有7000家,像“芙蓉酒家”、“芙蓉网吧”、“芙蓉丝绒”、“芙蓉乡”等使用“芙蓉”二字的企业不胜枚举,更别说“广东省广州市白云区”了。因此,我们只能从企业名称的前缀部分逐步剔掉地区冠名,即使用元字符“^”,先处理以省名开头的部分,接着再考虑去掉以县名开头的部分。
👉在处理县级名称的时候,我们还遇到更为复杂问题。即使是逐步剔除市县名,像“常德芙蓉王广告实业公司”这样的企业,若使用“芙蓉区?”这样的正则表达式,还是会出问题。经过再三考虑,我们决定保留县名。
In [4]: '|'.join(('^' + county_code['city'].drop_duplicates() + '?').tolist())
Out[4]: '^石家庄市?|^唐山市?......(省略)......^巴彦淖尔盟|^乌兰察布盟|......(省略)......
In [5]: '|'.join(('^' + county_code['city'].drop_duplicates() + '?').tolist())
Out[5]: '^北京市?|^天津市?......(省略)......^巴彦淖尔盟|^乌兰察布盟|......(省略)......^大兴安岭(地区)?|^延边朝鲜族(自治州)?......(省略)......
后记
►往期推荐
回复【Python】👉简单有用易上手
回复【学术前沿】👉机器学习丨大数据
回复【数据资源】👉公开数据
回复【可视化】👉你心心念念的数据呈现
回复【老姚专栏】👉老姚趣谈值得一看
►一周热文
工具&方法丨经济学圈特供 使用Jupyter Notebook的12个小技巧
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
欢迎扫描👇二维码添加关注