




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1云南财经大学信息学院
Python数据分析及应用第七章Pandas数据分析目录
7.1Pandas数据结构7.2DataFrame数据的基本操作7.3数据的导入与导出7.4数据的预处理7.5数据分组统计7.6创建透视表和交叉表(1)知识目标:掌握Pandas的两种数据结构及其基本操作、掌握DataFrame数据的基本操作,即数据的查改增删、掌握Pandas的数据导入与导出操作、掌握数据分析前的常用预处理操作、掌握Pandas中的数据分组、聚合以及统计操作、掌握Pandas中数据透视表和交叉表的创建方法。(2)技能目标:具备一定的数据分析和处理能力,能够运用Pandas高效地处理数据集、能够利用Pandas进行数据统计分析,如描述性统计、分组统计等,为数据分析和数据挖掘提供有力支持;具备一定的问题解决能力,面对实际的数据处理问题时,能够迅速分析并找到解决方案,利用Pandas工具集进行实践。(3)素质目标:保持对新技术和新方法的关注,持续学习;在处理复杂数据时,能够保持清晰的逻辑思维,有条理地进行数据分析和处理;数据处理工作往往繁琐且需要高度细致,能够保持耐心和细心,确保数据处理的准确性和完整性。3学习目标
销售数据如同一面镜子,清晰地映射出顾客需求、市场变化以及经营策略的有效性。为提升顾客满意度,增强市场竞争力,对销售数据进行分析显得很重要。本章将围绕小型商店的近期销售数据,通过pandas的数据分析技术,分析哪些商品受顾客青睐、每天的销售总额、每类商品的售出数量有何变化等。
通过本章的学习,您将掌握如何使用Pandas轻松应对各种数据处理挑战,系统地学习Pandas的基础知识,从核心数据结构DataFrame和Series的创建与操作开始,逐步深入到数据的导入与导出、清洗与转换、聚合与筛选、排序与索引等高级功能。4本章导读Pandas主要提供了两种数据类型:Series和DataFrame,Series是一维数据结构,DataFrame是二维数据结构。
在程序中要使用Pandas,首先需要导入该库,同时为方便使用,在导入时通常为该库起别名为“pd”,命令为:
importpandasaspd
在jupyternotebook中,可根据需要设置数据显示的行列数,通过调用pandas的set_option()方法来实现,如以下命令可设置在jupyternotebook中最多显示10行8列数据,超出部分使用省略号替换。pd.set_option('display.max_rows',10)pd.set_option('display.max_columns',8)57.1Pandas数据结构
Pandas中的Series类似于一维数组或列表,但功能更为强大。Series对象由索引(index)和数据(data)两部分组成的,索引也称为数据标签。索引用于标识数据的位置,可以是自动生成的整数,也可以是自定义的字符串等任意数据类型。数据部分则存储了Series的实际值,可以是数值、字符串、布尔值等任意数据类型。67.1.1Series对象可以使用pandas的Series()函数创建Series对象,其基本语法为:pd.Series(data,index=None)data是必要参数,指要放入Series中的数据,可以是列表、数组、字典等。index是可选参数,能够自定义Series对象的索引,如果没有指定索引,pandas会自动创建从0开始的整数索引。7(一)series的创建
实例7-1创建Series。importpandasaspddata1=[1,2,3,4,5]s1=pd.Series(data1)#使用列表创建Series,没有指定索引print(s1)data2=[10,20,30,40,50]s2=pd.Series(data2,index=['A','B','C','D','E'])#创建Series,自定义索引print(s2)data3={'a':100,'b':200,'c':300,'d':400,'e':500}s3=pd.Series(data3)#使用字典创建Series,字典的键作为索引print(s3)
通过index属性可以获取Series对象的索引,values属性可以获取Series对象的数据值。同时,与字符串、列表等数据类型一样,Series也支持索引和切片操作,可以通过索引来选择或修改数据,也可以通过切片获取一段范围内的数据,得到一个新的Series数据对象。8(二)series的常用操作
实例7-2series操作。importpandasaspddata1=[1,2,3,4,5]s1=pd.Series(data1)print('s1的索引:',s1.index)print('s1的数据:',s1.values)print('s1索引为0的数据:',s1[0])print('s1索引为1-3的数据:\n',s1[1:4])DataFrame是类似于二维数组或表格(如excel)的对象,它包含一组有序的列,每一列的数据类型是相同的,但不同列可以是不同的值类型(字符串、数字、日期时间等)。DataFrame既有行索引,又有列索引,可以看作由Series组成的字典。DataFrame包括3个基本要素,分别是索引、列、数据。在DataFrame的许多操作中,都使用了axis这一参数,用于指定操作是应用于行的方向还是列的方向,axis=0指操作应用于行,而axis=1指操作应用于列。97.1.2
DataFrame对象axis=0axis=1索引(index)列名(columns)数据(data)DataFrame的创建可以通过多种方式实现,最常用的是通过字典、列表、文件导入创建。使用字典创建DataFrame时,字典的键成为列名,字典的值(通常是列表或数组)成为对应列的数据。使用列表创建DataFrame时,实际上是通过列表的列表,即二维列表来创建,并通过使用columns属性指定列名。10(一)DataFrame的创建11实例7-3创建DataFrame。importpandasaspd#使用字典创建DataFramedata1={'Name':['Tom','Jerry','Mickey','Minnie'],'Age':[18,20,22,15],'City':['北京','上海','昆明','广州']}df1=pd.DataFrame(data1)print(df1)#使用列表的列表创建DataFramedata2=[['Tom',18,'北京'],['Jerry',20,'上海'],['Mickey',22,'昆明'],['Minnie',15,'广州']]df2=pd.DataFrame(data2,columns=['Name','Age','City'])print(df2)#使用字典创建DataFrame并自定义行索引df3=pd.DataFrame(data1,index=['A1','A2','A3','A4'])print(df3)12(二)DataFrame的常用属性和方法13实例7-4DataFrame的常用属性和方法。importpandasaspddata1={'Name':['Tom','Jerry','Mickey','Minnie'],'Age':[18,20,22,15],'City':['北京','上海','昆明','广州']}df1=pd.DataFrame(data1)print('df1的行列数:',df1.shape)print('df1每列的数据类型:\n',df1.dtypes)print('df1前2行:\n',df1.head(2))print('df1后3行:\n',df1.tail(3))print('df1中的随机2行:\n',df1.sample(2))
本节将介绍对DataFrame数据的提取、增加、删除、修改、条件检索等内容,使用相同的DataFrame进行操作,创建数据的代码为:importpandasaspddata={'ID':['001','002','003','004','005','006'],'名称':['苹果','香皂','牛奶','香蕉','笔记本','辣条'],'价格':[4.99,10.5,3.5,6.4,8.0,2.5],'类型':['水果','日用品','食品','水果','学习用品','食品'],'库存量':[20,50,10,8,30,15]}df=pd.DataFrame(data,index=['A','B','C','D','E','F'])147.2
DataFrame数据的基本操作157.2.1
数据的提取(一)行的提取1.使用索引提取行
格式为:DataFrame[a:b:k],a和b为行索引,k是步长(整数,默认为1)。a和b既可以自动行号,指提取从a行开始、到b行之前(不包含b行)、步长为k的行,如df[0:1]指提取df的第一行;也可以是自定义行索引,指提取从a行开始、到b行为止(包含b行)、步长为k的行,如df[’A’:’A’]也能提取df的第一行。实例7-5使用索引提取DataFrame行。print('df的前2行:\n',df[0:2])print('df的基数行:\n',df[0:6:2])print('df的C行到D行:\n',df['C':'D'])162.使用loc方法loc方法是根据索引值获取行。loc[]的语法格式为:DataFrame.loc[行标签,列标签]第一个参数指定行标签名,第二个参数指定列标签名,两个参数都可以是一个标签、一个标签列表或者一个范围。如果要提取的是不连续的多行,应将行标签名放入列表并传到第一个参数中。实例7-6使用loc方法提取DataFrame行。print('索引为A的行(series形式):\n',df.loc['A'])print('索引为A的行(DataFrame形式):\n',df.loc[['A']])print('索引为A至C的行:\n',df.loc['A':'C'])print('索引为A或C的行:\n',df.loc[['A','C']])173.使用iloc方法
iloc方法根据自动行号访问行。语法格式为:
DataFrame.iloc[行号,列号]第一个参数指定行号,第二个参数指定列号,两个参数都可以是单个整数、整数列表或整数切片。
实例7-7使用iloc方法提取DataFrame行。print('行号为1的行(series形式):\n',df.iloc[1])print('行号为1的行(DataFrame形式):\n',df.iloc[[1]])print('行号3开始的所有行:\n',df.iloc[3:])print('行号为1-3的行:\n',df.iloc[1:4])print('行号为1,2,4的行:\n',df.iloc[[1,2,4]])
18(二)列的提取
1.使用列名提取列
DataFrame是带有标签的二维数组,每个标签相当于每列的列名,因此,只要以字典访问某key的方式使用对应的列名,就可以提取DataFrame中的单列。访问多列数据时,需要将多个列名放入一个列表中。实例7-8使用列名提取列。print('ID列(series形式):\n',df['ID'])print('名称和价格列:\n',df[['名称','价格']])192.使用loc方法
loc方法是根据列名获取列,按照loc[]的语法,第一个参数设置为:表示所有行,第二个参数设置为要提取的列标签,行标签和列标签之间用逗号隔开。实例7-9使用loc提取列。print('ID列(series形式):\n',df.loc[:,'ID'])print('名称和价格列:\n',df.loc[:,['名称','价格']])203.使用iloc方法iloc方法根据自动列号访问列,按iloc[]的语法,第一个参数设置为:表示所有行,第二个参数设置为列号,行号和列号使用逗号分隔。实例7-10使用iloc提取列。print('列号为1的列:\n',df.iloc[:,1])print('列号为1、3的列:\n',df.iloc[:,[1,3]])print('列号3及之后的列:\n',df.iloc[:,3:])21(三)同时选择行和列
1.使用行索引和列名
格式为:DataFrame[行索引][列名],行索引和列名的顺序不限,谁在前都可以。实例7-11使用行索引和列名选择行列。print('第一行的名称:\n',df[0:1]['名称'])print('行号为2、3的名称和价格:\n',df[2:4][['名称','价格']])222.使用loc方法
loc方法根据行索引和列名选择行列,同时设置loc[]的两个参数即可选中对应的数据。实例7-12使用loc选择行列。print('行索引为A的名称:',df.loc['A','名称'])print('行索引为A的名称和价格:\n',df.loc['A',['名称','价格']])print('A至D行、名称至类型列:\n',df.loc['A':'D','名称':'类型'])print('A和D行、名称和类型列:\n',df.loc[['A','D'],['名称','类型']])233.使用iloc方法
同时设置iloc方法的行号和列号即可访问对应的数据。实例7-13使用iloc选择行列。print('行号为3、列号为2的数据:',df.iloc[3,2])#即第四行、第三列的数据print('行号为3,列号为1-3的数据:\n',df.iloc[3,1:4])print('行号为1和3,列号为1和4的数据:\n',df.iloc[[1,3],[1,4]])注意:在提取数据的过程中,如果行、列连续,使用冒号分隔,但没有索引运算符“[]”,如果行、列不连续,使用逗号分隔,同时使用索引运算符“[]”。247.2.2数据的修改
数据的修改首先要将需要修改的数据提取出来,再重新赋值为新的数据。数据的修改是针对原数据进行的,操作无法撤销。实例7-14修改行数据。df1=df.copy()#修改最后一行数据df1[5:6]=['006','钢笔',7,'学习用品',30]#修改行索引为E的名称为彩笔,其他列未设置、修改结果为NaNdf1.loc['E']={'名称':'彩笔'}df1(一)行的修改
行的修改就是先提取相关行,再直接修改行内容。25实例7-15修改列数据。#修改行索引为A和C的价格,其他行未设置、修改结果为NaNdf1['价格']={'A':100,'C':200}#修改库存量列数据df1['库存量']=[10,20,25,40,65,50]df1(二)列的修改
与行的修改一致,列的修改就是提取列后修改内容。26实例7-16修改单元格。#将第一行的“苹果”改为“苹果汁”df1.loc['A','名称']='苹果汁'#将"苹果汁"的类型改为“饮料”df1.iloc[0,3]='饮料'df1(三)单元格的修改
单元格的修改就是先定位到单元格,再修改内容。277.2.3数据的增加实例7-17增加行。df2=df.copy()df2.loc['G']=['007','菠萝',18.5,'水果',20]#利用loc定位到新行G,使用列表赋值df2.loc['H']={'ID':'008','名称':'洗衣液','价格':34.9}#使用字典为新行H赋值#定义新行new_rownew_row={'ID':'009','名称':'保鲜袋','价格':8.9,'类型':'日用品','库存量':30}#将new_row增加到df2中,ignore_index=True用于重置索引df2=df2._append(new_row,ignore_index=True)df2(一)行的增加
增加新行是将新的数据追加到DataFrame的末尾,实现的方法包括使用loc定位到新行后赋值、使用_append()方法和concat()方法等。28实例7-18增加列。df3=df.copy()#添加“进价”列,并填充数据df3['进价']=[3.5,6.8,2,5,4.5,1]#添加“利润”列,并使用计算出的价格和进价之差填充df3['利润']=df3['价格']-df3['进价']#添加“是否可售”列,所有的值均为逻辑Truedf3["是否可售"]=True#在列号为4的位置添加新列“上架日期”并填充数据df3.insert(4,'上架日期',['2024-5-1','2024-6-7','2024-7-10','2024-7-10','2024-7-15','2024-7-20'])df3(二)列的增加
要增加新列时,可以直接给DataFrame分配一个新的列名,并为其提供一个与DataFrame行数相匹配的序列(如列表、Series等)作为值,也可以使用insert()方法在指定位置增加新列。297.2.4数据的删除
删除某行或某列数据需要使用drop()方法,其基本语法为:DataFrame.drop(labels,axis=0,inplace=False)其常用参数为:drop()方法默认返回一个新的DataFrame,包含删除后的数据。因此,如果需要保留这个新的DataFrame,可以使用inplace=True指明在原来的DataFrame中删除,也可以将返回的DataFrame赋值给一个新的变量。30实例7-19删除数据。df4=df.copy()df4=df4.drop('A')#删除行标签为A的行,结果返回df4df4.drop(['B','D'],axis=0,inplace=True)#在df4中删除行标签为B和D的行df4=df4.drop('类型',axis=1)#删除列名为类型的列,结果返回df4df4.drop(df4.columns[2:3],axis=1)#删除价格到库存量的所有列,不修改df4df4317.2.5数据的筛选
数据筛选就是从大量的数据中选出有价值的数据,这样可以提高数据的可用性,有利于后期的数据分析,同时,结合删除、修改、增加操作,可以实现带条件的数据更新。条件表达式用于筛选、过滤数据,常使用比较操作符和逻辑操作符来构造。(一)按条件提取数据
实例7-20筛选数据。print('库存量小于15的商品:\n',df[df['库存量']<15])print('价格高于5的水果:\n',df[(df['价格']>5)&(df['类型']=='水果')])print('库存量大于等于15的水果或食品:\n',df[((df['类型']=='水果')|(df['类型']=='食品'))&(df['库存量']>=15)])print('除学习用品外的商品:\n',df[~(df['类型']=='学习用品')])print('苹果、牛奶和辣条:\n',df[df['名称'].isin(['苹果','牛奶','辣条'])])(二)按条件操作数据
实例7-21按条件操作数据。df5=df.copy()#删除食品df5=df5.drop(df5[df5['类型']=='食品'].index)#将df中价格在5-10之间的商品追加到df5中df5=df5._append(df[df['价格'].between(5,10)])#将库存量小于10的商品价格调整为原来的2倍df5.loc[df5['库存量']>10,'价格']=df5.loc[df5['库存量']>10,'价格']*2df5347.3
数据的导入与导出7.3.1数据导入pandas库将外部数据转换为DataFrame数据格式,处理完成后可再存储到外部文件中,这就是数据的导入和导出。
不同的数据源,需要使用不同的函数读取,pandas内置了10余种数据源读取函数和对应的数据写入函数。(一)导入文本文件
文本文件是一种由若干字符构成的计算机文件,是典型的顺序文件。CSV是“Common—SeparatedValues”的缩写,意思是逗号分隔值,这种文件以纯文本形式存储表格数据,是一种简单通用的文件格式。但CSV文件的分隔符不一定是逗号,所以又被称为字符分隔文件。Pandas提供了read_table()来读取文本文件,read_csv()来读取CSV文件。这两个函数的基本语法格式为:pandas.read_table(filepath,sep=’\t’,header=’infer’,names=None,encoding=’utf-8’,nrows=None)pandas.read_csv(filepath,sep=’,’,header=’infer’,names=None,encoding=’utf-8’,nrows=None)实例7-22导入CSV文件。importpandasaspd#使用read_table()导入股票数据,指定分隔符和编码方式frame1=pd.read_table('data//股票数据.csv',sep=',',encoding='gbk')print(frame1.head())#使用read_csv()导入股票数据frame2=pd.read_csv('data//股票数据.csv',encoding='gbk')print(frame2.sample(3))(二)导入EXCEL文件
Pandas提供了read_excel()方法来读取Excel文件,扩展名可以是.xls或者.xlsx,其语法为:pandas.read_excel(io,sheet_name=0,header=’infer’,names=None,dtype=None)实例7-23导入Excel文件。#使用read_excel导入景区.xlsx第一张工作表中的数据frame4=pd.read_excel('data//景区.xlsx')frame4407.3.2数据导出(一)导出CSV文件
利用pandas中的DataFrame创建或编辑数据后,可以把这些数据保存到CSV文件中,这需要使用DataFrame的to_csv()方法,其基本语法为:DataFrame.to_csv(path,sep=’,’,columns=None,header=True,index=True,mode=’w’)41实例7-24输出CSV文件。importpandasaspdimportnumpyasnp#生成一个5行4列的DataFrame,数据由numpy产生的0-1之间的随机小数填充frame5=pd.DataFrame(np.random.uniform(0,1,size=(5,4)),columns=['A','B','C','D'])print(frame5)#将生成的frame5导出为file1.csvframe5.to_csv('data//file1.csv')42(二)导出EXCEL文件
要将DataFrame中的数据存储为Excel文件,需要使用DataFrame的to_excel()方法,其基本语法为:DataFrame.to_excel(excel_writer,sheet_name=’Sheet1’,columns=None,header=True,index=True,)该方法的常用参数与to_csv()基本一致,区别在于指定excel文件存储路径使用excel_writer,同时增加了sheet_name参数,用于指定工作表名,默认为Sheet1。43实例7-25输出excel文件。importpandasaspdimportnumpyasnp#生成6行5列的DataFrame,数据由numpy产生的1-99之间的随机整数填充frame6=pd.DataFrame(np.random.randint(1,100,size=(6,5)),columns=list('ABCDE'))print(frame6)#将生成的frame6导出为file2.xlsxframe6.to_excel('data/file2.xlsx')447.4
数据的预处理
在Pandas中,数据的预处理是一个广泛的概念,涵盖了数据清洗、整理、合并、转换等多个方面,用于确保数据分析中数据的质量和可用性。本节将介绍DataFrame的标签修改、排序、数据合并操作以及缺失值、重复值的处理,使用的数据来自“商品销售数据.xlsx”,导入数据的代码如下:importpandasaspd#从商品销售.xlsx中导入商品基本信息表,指定ID列为字符串类型product=pd.read_excel('data//商品销售.xlsx',sheet_name='商品基本信息',dtype={'ID':str})#从商品销售.xlsx中导入销售信息表,指定商品ID列为字符串类型sale=pd.read_excel('data//商品销售.xlsx',sheet_name='销售信息',dtype={'商品ID':str})457.4.1标签修改(一)使用rename()方法
作为一种二维标签数据结构,包括行索引(index)和列标签(columns)在内的DataFrame标签,能够使用多种方法进行修改。rename()方法可以用来修改行索引或列标签,其基本语法如下:DataFrame.rename(index=None,columns=None,inplace=False)index和columns参数分别用于定义新的行索引和列标签,inplace参数是个布尔值,表示是否在原始数据上进行修改,默认为False,如果要改动原始数据,应该将inplace参数设置为True。修改列标签时,需要将columns参数设置为一个列表或字典,其中包含新的列名。而修改行索引时,需要将index参数设置为列表或字典,其中包含新的行索引。46实例7-26rename()方法修改标签。product1=product.copy()#将product1的行索引1改为“A”,2改为“B”product1.rename(index={1:'A',2:'B'},inplace=True)#临时修改product的列名:将名称改为商品名,类型改为类别product1.rename(columns={'名称':'商品名','类型':'类别'})print(product1)47(二)直接设置属性
通过修改columns属性或index属性来更改标签的方法更简单直接,但要注意的是,需要提供一个与原始列名或行索引长度相同的列表(或类似结构),其中包含新的列名或行索引。实例7-27通过设置属性修改标签。#修改product1的index属性,设置所有的行索引为奇数product1.index=range(1,20,2)#修改product1的columns属性,重新设置所有的列标签product1.columns=['ID',"name",'price','type','quantity']product148(三)使用set_index()和reset_index()方法设置行索引
set_index()和reset_index()都可以用于设置行索引,set_index()的基本语法为:DataFrame.set_index(keys,drop=True,inplace=False)
参数中的keys用于设置将哪列作为新的index,将某列设置为行索引后,drop参数用于设置是否删除该列,默认为True,即删除该列,而inplace参数则决定了是否对原数据进行修改。
reset_index()方法用于还原索引列。49实例7-28set_index()和reset_index()方法的使用。#使用set_index()方法设置name和type为行索引product1.set_index(['name','type'],inplace=True)print('设置了索引的product1:\n',product1)#将product1的两个索引列变成普通列,重置索引product1.reset_index(inplace=True)print('重置索引的product1:\n',product1)507.4.2排序(一)sort_values()方法
基本语法为:DataFrame.sort_values(by,axis=0,ascending=True,inplace=False)
在Pandas中,对DataFrame进行排序是常见的操作,可以使用sort_values()或sort_index()方法来实现。sort_values()方法按值排序,而sort_index()方法按索引排序。51实例7-29sort_values()的使用。print('按价格进行升序排列:\n',product.sort_values(by='价格'))print('先按类型升序、类型相同再按价格降序排列:\n',product.sort_values(by=['类型','价格'],ascending=[True,False]))52(二)sort_index()方法
DataFrame.sort_index(axis=0,ascending=True,inplace=False)axis参数指定排序的方向,0表示按行索引,1表示按列名排序,ascending和inplace分别用于指定是否升序排列、是否修改原数据。实例7-30sort_index()的使用。print('按行索引降序排列:\n',product.sort_index(ascending=False))print('按列名升序排列:\n',product.sort_index(axis=1))537.4.3数据合并(一)concat()方法
concat()函数能沿着一条轴将多个对象堆叠到一起,可以用来合并DataFrame或Series。其基本语法为:pandas.concat(objs,axis=0,join=’outer’,ignore_index=False)Pandas允许将两个或多个DataFrame根据一些共同的属性(如索引、列等)合并成一个新的DataFrame,它提供了多种数据合并的方法,包括join()、concat()、merge()等。54实例7-31使用concat()方法纵向合并数据。#提取product行索引为0-2的三行p1=product.loc[0:2]#提取product行索引为8-9的两行p2=product.loc[8:9]#临时合并p1和p2print(pd.concat([p1,p2]))#合并p1和p2,重新索引,同时将结果保存在product2中product2=pd.concat([p1,p2],ignore_index=True)print('product2:\n',product2)55实例7-32使用concat()方法横向合并数据。#定义new_cols,保存三个商品的供应商和上架时间new_cols=pd.DataFrame({'供应商':['果先生','力士','大理牧场'],'上架日期':['2024-7-1','2024-1-3','2024-7-18']})#临时横向合并product2和new_cols,结果为默认的并集print(pd.concat([product2,new_cols],axis=1))#以交集、横向方式合并product2和new_cols,结果保存在product2中product2=pd.concat([product2,new_cols],join='inner',axis=1)print(product2)56(二)merge()方法
merge是基于数据库风格的连接操作,用于合并两个或多个DataFrame。它可以根据一个或多个键将行连接起来。该方法合并数据有4种方式,分别是内连接、左连接、右连接和外连接。其基本语法为:pandas.merge(left,right,how=’inner’,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=(‘_x’,_y’))571.内连接(inner)
内连接是merge()方法的默认连接方式,表示同时将左、右连接对象作为参考对象,根据相同的列将左表和右表连接起来,结果中包含连接键的交集。实例7-33内连接1。#以product为左表、sale为右表进行内连接,左表键为ID,右表键为商品IDpd.merge(product,sale,left_on='ID',right_on='商品ID')实例7-34内连接2。#修改product的ID列为商品IDproduct.rename({'ID':'商品ID'},axis=1,inplace=True)#自动按相同的列进行内连接,结果中去除了多余的同名连接列ps_inner=pd.merge(product,sale)ps_inner582.左连接(left)
左连接的结果中只包含左表的键,如果右表中不存在左键对应的值,相应的列就会填充为NaN。实例7-35左连接。ps_left=pd.merge(product,sale,how='left')ps_left3.右连接(right)
右连接的结果中只包含右表的键,如果左表中不存在右键对应的值,相应的列就会填充为NaN。。实例7-36右连接。ps_right=pd.merge(product,sale,how='right')ps_right594.外连接(outer)外连接的结果中包含左右表键的并集实例7-37外连接。ps_outer=pd.merge(product,sale,how='outer')ps_outer607.4.4缺失值处理(一)检测缺失值isnull()或isna()方法都会返回一个与原DataFrame形状相同的布尔型DataFrame,其中True表示缺失值(NaN),False表示非缺失值。(二)填充缺失值fillna()方法用于填充缺失值,可以指定一个常量值、DataFrame、Series、字典或用于计算填充值的函数作为填充值。如果指定了字典,则可以使用不同的值来填充不同的列。另外,如果要修改原数据,则需要设置inplace参数为True。
在DataFrame中,缺失值通常使用NaN(NotaNumber)来表示。处理缺失值是数据清洗和预处理过程中的一个重要步骤。Pandas提供了多种方法来处理这些缺失值,包括删除含有缺失值的行或列、填充缺失值以及检测缺失值等。61(三)删除缺失值dropna()方法用于删除包含缺失值的行或列。基本语法为:DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)实例7-38缺失值处理(本例使用实例7-37合并生成的ps_outer,该DataFrame包含21行数据,其中有两行包含空值,行号分别为14和21)。#修改数量列的空值为100ps_outer['数量'].fillna(100,inplace=True)print(ps_outer.loc[[14]])#删除包含空值的行,剩余20行数据ps_outer.dropna(inplace=True)print('剩余行数:',len(ps_outer))637.4.5重复值处理
在数据预处理阶段,处理重复值也是一个常见的任务。利用DataFrame的duplicated()方法判断是否有重复数据,即每一行是否与之前的行完全相同。如果有重复数据,则可以利用drop_duplicates()方法删除重复的行,该方法使用inplace参数指定是否在原数据中删除。实例7-39检测重复值(本例使用实例7-34合并生成的ps_inner)。print(ps_inner.duplicated())实例7-40删除重复值。ps_inner.drop_duplicates(inplace=True)ps_inner647.5
数据分组统计
DataFrame的分组统计允许用户根据一个或多个列的值将数据分组成子集,并对每个子集执行统计运算。这种操作在处理和分析具有层次结构或分类数据时特别有用,比如销售数据按地区和产品分类、客户数据按年龄和性别分组等。657.5.1数据的描述性统计
可以使用DataFrame的描述性统计函数describe()快速了解数据的基本统计特征,如中心趋势、分散程度等。describe()是获取DataFrame描述性统计信息的最直接方法。
默认情况下,describe()方法会计算数值型列的计数(count)、均值(mean)、标准差(std)、最小值(min)、四分位数(25%,50%,75%)和最大值(max)。对于非数值型列,则会计算唯一值(unique)、众数(top)和频数(freq)。实例7-41数据描述性统计。frame=ps_inner.copy()#描述性统计frame.describe()667.5.2常用聚合函数
聚合函数也称多行函数或组合函数,能够对一组值进行计算,并返回一个值。常用聚合函数有:实例7-42聚合函数的应用。#计算售出的总数量,即数量列的总和print('售出总量:',frame['数量'].sum())#计算价格的平均值print('商品平均价格:',frame.loc[:,'价格'].mean())#计算库存量的最大值print('最大库存量:',frame.iloc[:,4].max())#计算记录数print('记录数量:',frame['商品ID'].count())#计算该DataFrame中的商品数量,即不重复的商品IDprint('商品数量:',frame['商品ID'].nunique())#查询单次售出最多的记录,即数量等于数量最大值的商品print('单次售出最多的记录:\n',frame[frame['数量']==frame['数量'].max()])#查询价格高于商品平均价格的日用品售出记录print(frame[(frame['类型']=='日用品')&(frame['价格']>frame['价格'].mean())])687.5.3数据的分组聚合
数据分组聚合的核心方法是先进行分组,然后对每个分组应用聚合函数,基本步骤包括:1.确定组依据:首先,需要确定根据哪些列的值来分组。这些列将作为分组的“键”,决定了数据如何被划分成不同的子集。2.确定聚合函数:一旦数据被分组,就可以对每个分组应用聚合函数来计算统计量。这些聚合函数可以是7.5.2中介绍的内置聚合函数,如sum()、mean()、min()、max()、count()等,也可以是自定义的函数。3.执行分组统计:使用groupby()方法选择分组依据,并通过链式操作调用聚合函数来执行分组统计。69(一)groupby()分组函数
在pandas中,数据分组使用groupby()函数,它能根据一个或多个键将DataFrame分成不同的组。分组的过程就是将原有的DataFrame按照键的值,划分为若干个分组DataFrame,被分为多少个组就有多少个子DataFrame。因此,groupby()函数得到一个GroupBy对象,并没有进行实际运算,只是包含了分组后的中间数据。groupby()的基本语法为:DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,dropna=True)实例7-43数据分组。#按类型分组,查看分组情况gs1=frame.groupby('类型')print('类型分组:\n',gs1.groups)#先按销售日期分组,再按类型分组,查看分组情况gs2=frame.groupby(['销售日期','类型'])print('按销售日期和类型分组:\n',gs2.groups)虽然groupby()本身不是一个聚合函数,但它与聚合函数结合使用时非常强大,可以在groupby()返回的分组调用聚合函数。实例7-44所有列的分组聚合。#对gs1分组结果应用count()gs1.count()如果统计只针对部分列进行,可以在命令中选择相关列进行操作,选择多列统计时,列名应该放在列表中。实例7-45分组聚合应用。#查询各类商品的最低价格,即按类型分组,对价格进行求最小值运算print('各类商品的最低价格:\n',frame['价格'].groupby(frame['类型']).min())print('-'*50)#查询每天的销售额,即按销售日期分组,对小计(新增列:价格*数量)进行求和运算frame['小计']=frame['价格']*frame['数量']print('每天的销售额:\n',frame.groupby('销售日期')[['小计']].sum())print('-'*50)#查询每天每类商品的最高销售额,即按销售日期和类型分组,对小计和数量求最大值print('每天各类商品的最高销售额:\n',frame.groupby(['销售日期','类型'])[['小计','数量']].max())print('-'*50)#查询最畅销的两种商品,即按名称分组,求出数量的和后降序排列,再显示前两项print('最畅销的两种商品:\n',frame['数量'].gro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB32/T 3847-2020用电场所智慧安全监控系统技术规范
- DB32/T 3761.9-2020新型冠状病毒肺炎疫情防控技术规范第9部分:职业健康技术服务机构
- DB32/T 3643-2019气压劈裂真空预压加固软土地基技术规程
- DB31/T 680.3-2017城市公共用水定额及其计算方法第3部分:游泳池
- DB31/T 229-2011矿物油型有机热载体
- DB31/T 1256-2020消毒产品卫生安全评价信息数据集
- DB31/T 1193-2019山鸡养殖技术规范
- CAB 1027-2014汽车罩
- 高中三年如何规划:从高一到高三的全程指南
- 2024年工艺气体压缩机资金筹措计划书代可行性研究报告
- GB 45672-2025车载事故紧急呼叫系统
- 规划测量协议书
- 模具开发保密协议书
- DB41T 2794-2024高速公路隧道和高边坡监测技术指南
- 2025年会展经济与管理考试试题及答案
- 2025年护士考试安全管理试题及答案
- 2024秋招北森题库数学百题
- 招聘社工考试试题及答案
- 砖和砌块材料试题及答案
- TCCEAS001-2022建设项目工程总承包计价规范
- 输变电工程施工质量验收统一表式附件4:电缆工程填写示例
评论
0/150
提交评论