01

上一篇分享,主要简介了pandas的常用操作步骤:

(1)创建DataFrame,使用DataFrame()函数

(2) 提取指定列,inplace表示对字段值进行修改并返回,str.contains()函数对字段值进行模糊匹配筛选

(3)修改列名

(4)数据一般处理环节。例如字符统计、列提取、空值处理等

(5)map与lambda一起使用,代码更加简洁,其中lambda是匿名函数

本篇引言

02

本章使用pandas对数据进行多种处理,主要有:缺失值处理、字段抽取、字段拆分、记录抽取、记录合并、字段合并、字段匹配等、数据标准化、数据分组、以及时间处理等

实例应用

03

(1)空值处理

①找出空值位置

df.isnull()#找出空值的位置isNA = df.isnull()

python dataframe 字符串两列模糊匹配_pandas concat函数

②获取空值所在列,isNA()函数可以按行取数

#获取出空值所在的行df[isNA.any(axis=1)]df[isNA[['key']].any(axis=1)]

python dataframe 字符串两列模糊匹配_pandas merge on_02

(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)

python dataframe 字符串两列模糊匹配_pandas concat_03

原数据第二列为电话号码,需要将号码区分截取

#运营商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

python dataframe 字符串两列模糊匹配_pandas merge函数_04

(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']

python dataframe 字符串两列模糊匹配_sql 两条数据 空值合并_05

python dataframe 字符串两列模糊匹配_pandas concat_06

(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)