01
上一篇分享,主要简介了pandas的常用操作步骤:
(1)创建DataFrame,使用DataFrame()函数
(2) 提取指定列,inplace表示对字段值进行修改并返回,str.contains()函数对字段值进行模糊匹配筛选
(3)修改列名
(4)数据一般处理环节。例如字符统计、列提取、空值处理等
(5)map与lambda一起使用,代码更加简洁,其中lambda是匿名函数
本篇引言
02
本章使用pandas对数据进行多种处理,主要有:缺失值处理、字段抽取、字段拆分、记录抽取、记录合并、字段合并、字段匹配等、数据标准化、数据分组、以及时间处理等
实例应用
03
(1)空值处理
①找出空值位置
df.isnull()#找出空值的位置isNA = df.isnull()
②获取空值所在列,isNA()函数可以按行取数
#获取出空值所在的行df[isNA.any(axis=1)]df[isNA[['key']].any(axis=1)]
(2)字段抽取
slice(start,stop)
start 默认大于等于
stop 默认小于
例如slice(0,3)
index从0(包含0)起始,取0,1,2对应索引的值
注:slice()函数作用与str类型的数据,故需要将数据类型使用astype()函数强转成str类型
#数据框中默认为int变量,需要将数据类型转换成str类型df['tel'] = df['tel'].astype(str)
原数据第二列为电话号码,需要将号码区分截取
#运营商bands = df['tel'].str.slice(0, 3)#地区areas = df['tel'].str.slice(3, 7)#号码段nums = df['tel'].str.slice(7, 11)#赋值回去,添加列df['bands'] = bandsdf['areas'] = areasdf['nums'] = nums
(3)字段拆分:按照固定的字符,拆分已有字符串
split(sep,n,expend=False)
sep:用于分隔的字符串
n:分割为多少列
expend:是否展开为数据框,默认为False
返回值:
如果expend为True,则返回DataFrame
如果expend为False,则返回Series
from pandas import read_csvdf = read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//4.7//data.csv')newDF = df['name'].str.split(' ', 1, True)newDF.columns = ['band', 'name']
(4)记录合并:是将两个结构相同的数据框合并成一个数据框
类似与SQL中的union,要求数据结构和字段数量保持一致
使用concat([dataFrame1,dataFrame2,.....])
①dataFrame1
②dataFrame2
返回值:
DataFrame
import pandas as pdfrom pandas import read_csvdata1 = read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//data_stady//4.10//data1.csv', sep="|")data2 = read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//data_stady//4.10//data2.csv', sep="|")data3 = read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//data_stady//4.10//data3.csv', sep="|")data = pd.concat([data1, data2, data3])'''data1抽取0,1data2抽取1,2data3抽取0,2'''data = pd.concat([ data1[['id','comments']], data2[['comments', 'title']], data3[['id', 'title']]])
(5)字符匹配:根据各表共有的关键字段,把各表的所需记录一一对应起来
类似SQL的join操作,也分左连接和右连接,内连接和外连接
使用merge(x,y,left_on,right_on)
x:第一个数据框
y:第二个数据框
left_on:第一个数据框用于匹配的列
right_on:第二个数据框用于匹配的列
left_on和right_on可以理解为SQL中使用join中的on条件
#SQL中的join解释select * from table1 aleft table1 b on a.colunms1=b.colunms2
返回值:DataFrame
import pandasitems = pandas.read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//data_stady//4.12//data1.csv', sep='|', names=['id', 'comments', 'title'])prices = pandas.read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//data_stady//4.12//data2.csv', sep='|', names=['id', 'oldPrice', 'nowPrice'])#默认只是保留连接上的部分itemPrices = pandas.merge( items, prices, left_on='id', right_on='id')#即使连接不上,也保留左边没连上的部分itemPrices = pandas.merge( items, prices, left_on='id', right_on='id', how='left')#即使连接不上,也保留右边没连上的部分itemPrices = pandas.merge( items, prices, left_on='id', right_on='id', how='right')#即使连接不上,也保留所有没连上的部分itemPrices = pandas.merge( items, prices, left_on='id', right_on='id', how='outer')
(6)数据分组: 采用cut()函数
cut(series,bins,right=true,labels=labels)
seris:指定的数据列
bins:分组,一般在分组域划分中,将min(series)-1,max(series)+1,以防数据边间过界
right:是否右闭环,默认true
columns:指定列名
import pandas as pddata = pandas.read_csv( 'C://Users//wuyinan//Desktop//DataAnalysis//data_stady//4.15//data.csv', sep='|')bins=[ min(data.cost)-1,20,40,60,80,100,max(data.cost)+1 ]data['test']=pd.cut(data.cost,bins,right=False)labels = [ '20以下', '20到40', '40到60', '60到80', '80到100', '100以上']data['test']=pd.cut(data.cost,bins,right=True,labels=labels)max(data['cost'])bins = [ min(data.cost)-1, 20, 40, 60, 80, 100, max(data.cost)+1]data['cut'] = pandas.cut( data.cost, bins)data['cut'] = pandas.cut( data.cost, bins, right=False)labels = [ '20以下', '20到40', '40到60', '60到80', '80到100', '100以上']data['cut'] = pandas.cut( data.cost, bins, right=False, labels=labels)