Python 重写一个提取字符串中行政区划的 Series(下)

Python 重写一个提取字符串中行政区划的 Series(下)

创作背景

本菜鸡最近在数据分析时遇到这样一列数据,如图
在这里插入图片描述
我想进行的操作是:

  1. 提取其中 各行政区划及名称。eg: 江苏省北京市 这种。目标已达成,详见文章
  2. pd.to_datetime() 后可以调用 time_series.dt.year 返回对应的 年序列 一样,我的 area_series 可以返回对应的 省,市,市辖区/县。详见本文。
  3. 注:本文将 市辖区 认为是 平级,便于数据提取,如有不妥请指正

如果觉得我这篇文章写的好的话,能不能给我 点个赞评论 一波。
如果要点个 关注 的话也不是不可以🤗

思路分析 - 编写类方法

返回一个结果

首先我们得写个方法,作用如下:

  1. 显示的结果是 原字符串,方法是设置函数 __str__
  2. 返回属性 provincecitycounty 对应的数据,方法是使用装饰器 @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 函数用来 解析字符串
  • provincecitycounty 都是由 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 的小伙伴可以 私信我 进群哦。

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值