Python 重写一个提取字符串中行政区划的 Series(下)
创作背景
本菜鸡最近在数据分析时遇到这样一列数据,如图
我想进行的操作是:
- 提取其中
各行政区划及名称
。eg: 江苏省,北京市 这种。目标已达成,详见文章。 - 像
pd.to_datetime()
后可以调用time_series.dt.year
返回对应的年序列
一样,我的area_series
可以返回对应的 省,市,市辖区/县。详见本文。 - 注:本文将 市辖区 和 县 认为是 平级,便于数据提取,如有不妥请指正。
如果觉得我这篇文章写的好的话,能不能给我 点个赞 ,评论 一波。
如果要点个 关注 的话也不是不可以🤗
思路分析 - 编写类方法
返回一个结果
首先我们得写个方法,作用如下:
- 显示的结果是 原字符串,方法是设置函数
__str__
。 - 返回属性
province
,city
,county
对应的数据,方法是使用装饰器@property
。
代码如下:
divisions = {
'province': ['省', '自治区'],
'city': ['市'],
'county': ['区', '旗', '县']
}
class ToCityOne:
def __init__(self, word):
self.word = word
self.result = {}
self.__extract()
def __check_exist(self, area, names):
for name in names:
if name in area:
return area
else:
return ''
# 同上一篇文章
def __extract(self):
# '\S+省|\S+自治区|\S+市|\S+旗|\S+区|\S+县'
result = re.findall('|'.join(['|'.join(['\S+' + char for char in chars]) for chars in divisions.values()]), self.word)
count = 0
for key in divisions:
if count != len(result):
test_exist = self.__check_exist(result[count], divisions[key])
self.result[key] = test_exist
if test_exist:
count += 1
else:
self.result[key] = ''
@property
def province(self):
return self.result['province']
@property
def city(self):
return self.result['city']
@property
def county(self):
return self.result['county']
def __str__(self):
return self.word
__repr__ = __str__
其中:
__extract
函数用来 解析字符串。province
,city
,county
都是由property
装饰器创建的 只读属性,property
教程见这里。__str__
和__repr__
是直接print
对象时显示的结果。
测试一下:
可以看出,结果中都包含 空字符串,因为 字符串不包含对应的数据。
结果还是不错的。
返回 Series 结果
上边的 ToCityOne
返回的结果确实还不错,但那都是 提取一个字符串的信息,需要搭配 map
函数。
如果要提取整个 Series
并按属性直接返回一个新的 Series
,那就使用 map
函数,再封装一下就好了。
代码如下:
class ToCity(pd.Series):
def __init__(self, area_series):
# 为了能直接返回 Series 对象,使本类继承于 pandas.Series
super(ToCity, self).__init__(area_series)
self.series = area_series
self.result = {}
self.__process()
def __process(self):
# 获得分析字符串后的对象
result = self.series.map(ToCityOne)
for key in divisions:
# 获得对应的结果列表
s = result.map(lambda x: eval(f'x.{key}'))
self.result[key] = s
@property
def province(self):
return self.result['province']
@property
def city(self):
return self.result['city']
@property
def county(self):
return self.result['county']
测试一下:
看起来不错,算是成功达到目标!
结尾
有想要一起学习 python
的小伙伴可以 私信我
进群哦。
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。