栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Python 重写一个提取字符串中行政区划的 Series(下)
    • 创作背景
    • 思路分析 - 编写类方法
      • 返回一个结果
      • 返回 Series 结果
    • 结尾

创作背景

本菜鸡最近在数据分析时遇到这样一列数据,如图

我想进行的操作是:

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

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

思路分析 - 编写类方法 返回一个结果

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

  1. 显示的结果是 原字符串,方法是设置函数 __str__ 。
  2. 返回属性 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 的小伙伴可以 私信我 进群哦。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号