pandas数据的字段抽取与拆分
数据抽取,也称为数据拆分,它是通过保留、抽取源数据表中的某些字段、记录的部分信息来形成一些新字段和新记录。例如,在手机号码里包含运营商、地区和号码段等信息,通过数据抽取获得相应的字段后,就可以对相应的数据进行分析。
例如,手机号码 1857332XXXX 中前 3 位 185 表示运营商,中间 4 位 7332 表示地区,后面 4 位 XXXX 是号码段。
例如,在“商品信息”字段中包含品牌、分类和型号等信息,为了便于数据分析,需要将“商品信息”字段拆分为“品牌”“分类”和“型号”等字段。如“Haier冰箱BCD-630WBGUU1”,可拆分为品牌为“Haier”,分类为“冰箱”,型号为“BCD-630WBGUU1”。
【例 1】在商品销售.xls文件中包含了用户 ID、商品信息、单价、数量和电话等数据字段,现要求完成下列分类统计计算。
1) 按品牌分类统计商品销售数量。
2) 按商品种类分类统计商品销售数量。
3) 按地区分类统计商品销售数量。
程序设计思路:首先导入商品销售.xls数据,然后,将“商品信息”字段拆分为“品牌”“分类”和“型号”3 个字段,再分别按“品牌”和“分类”字段进行分类统计计算。同时,从“电话”字段中抽取出地区号,按地区号分类统计商品销售数量。
其示例代码 test1.py 如下。
字段抽取
字段抽取是根据已知列数据的开始和结束位置,抽取出新的列。字段抽取采用 slice() 函数,该函数的语法格式如下:Series.str.slice(start=None, stop=None)
函数中的参数说明如下:- start:表示字段抽取的开始位置;
- stop:表示字段抽取的结束位置。
例如,手机号码 1857332XXXX 中前 3 位 185 表示运营商,中间 4 位 7332 表示地区,后面 4 位 XXXX 是号码段。
字段拆分
字段拆分是按照固定的字符,拆分已有的字符串。字符分割函数有正序分割列 split() 函数和逆序分割列 rsplit() 函数,其中,split() 函数的语法格式如下:Series.str.split(sep=None, n=-1, expand=False)
函数中的参数说明如下:- sep:表示用于分割字符的字符串,默认使用空白分割;
- n:接收整数,默认为 -1,表示分割的列数;
- expand:接收布尔值,默认为 False,如果为 True,返回数据框(DataFrame)或复杂索引(MultiIndex);如果为 False,返回序列(Series)或者索引(Index)。
例如,在“商品信息”字段中包含品牌、分类和型号等信息,为了便于数据分析,需要将“商品信息”字段拆分为“品牌”“分类”和“型号”等字段。如“Haier冰箱BCD-630WBGUU1”,可拆分为品牌为“Haier”,分类为“冰箱”,型号为“BCD-630WBGUU1”。
【例 1】在商品销售.xls文件中包含了用户 ID、商品信息、单价、数量和电话等数据字段,现要求完成下列分类统计计算。
1) 按品牌分类统计商品销售数量。
2) 按商品种类分类统计商品销售数量。
3) 按地区分类统计商品销售数量。
程序设计思路:首先导入商品销售.xls数据,然后,将“商品信息”字段拆分为“品牌”“分类”和“型号”3 个字段,再分别按“品牌”和“分类”字段进行分类统计计算。同时,从“电话”字段中抽取出地区号,按地区号分类统计商品销售数量。
其示例代码 test1.py 如下。
# -*- coding: utf-8 -*- import numpy as np import pandas as pd #导入数据 data = pd.read_csv('d:\data\goods_sales.csv',encoding='GBK') print(data) #将商品信息拆分成3列的数据框 newData = data['商品信息'].str.split(';', 3, True) newData.columns = ['品牌', '分类','型号'] #设置列名 print(newData) df = data.drop('商品信息', axis=1).join(newData) result = df.groupby(by=['品牌'])['数量'].agg({ '数量':np.sum}) print(result) result = df.groupby(by=['分类'])['数量'].agg({ '数量':np.sum}) print(result) #抽取电话号码地区号 telData = data['电话'].astype(str) areas = telData.str.slice(3, 7) print(areas) newDf = data.drop('电话', axis=1).join(areas) print(newDf) result = newDf.groupby(by=['电话'])['数量'].agg({ '数量':np.sum}) print(result)