循序渐进Python程序设计 课件 第10、11章Pandas库的使用、Matplotlib库应用基础_第1页
循序渐进Python程序设计 课件 第10、11章Pandas库的使用、Matplotlib库应用基础_第2页
循序渐进Python程序设计 课件 第10、11章Pandas库的使用、Matplotlib库应用基础_第3页
循序渐进Python程序设计 课件 第10、11章Pandas库的使用、Matplotlib库应用基础_第4页
循序渐进Python程序设计 课件 第10、11章Pandas库的使用、Matplotlib库应用基础_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

01020304第10章Pandas库的使用10.1Pandas概述10.2Pandas数据结构10.3数据操作基础9.4数据分析基础059.5综合应用案例10.1Pandas概述10.1.1结构化数据处理的挑战Pandas优势第10章Pandas库的使用10.1.1结构化数据处理的挑战10.1Pandas概述1.实数据集往往包含混合类型的数据列,例如同时存在数值型、文本型和时间戳型数据。缺失值处理是结构化数据分析中无法回避的难题。结构化数据分析经常需要实现类似数据库的关系型操作,包括表连接(join)、分组聚合(groupby)等复杂操作。10.1.2

Pandas优势在技术实现上,Pandas的标签对齐机制有效解决了数据操作中的索引匹配问题。从功能体系来看,Pandas提供了数据分析所需的全套基础操作。10.2Pandas数据结构10.2.1Series:带标签的一维数组10.2.2DataFrame:二维表格型数据结构第10章Pandas库的使用10.2.1Series:带标签的一维数组importpandasaspdd1=[10,20,30,40]s1=pd.Series(d1)

#从列表创建Series,序号是索引,从0开始d2={'a':10,'b':20,'c':30}s2=pd.Series(d2) #从字典创建Series,键是索引s3=pd.Series(5,index=['a','b','c'])#从标量值创建Series,指定索引标签10.2Pandas数据结构1.创建Series对象Series语法格式:Series(data,index=None,dtype=None,name=None)参数说明:data:指定数据源,可以是标量、列表、字典、NumPy数组等;index:指定Series的索引,索引可以是列表、数组或者index对象;dtype:用于指定数据类型,如int,float,str。不指定时会自动推断数据类型;name:为Series命名。【例10.1】【练一练10.1】用“Mon、Tue、Wed.Thur、Fri、Sat、Sun”作为数据值,用“1、2、3、4、5、6、7”作为索引,创建一个名为“week”的Series。第10章Pandas库的使用10.2.1Series:带标签的一维数组10.2Pandas数据结构2.Series对象的属性Series对象的属性(5)size:返回Series中元素的数量(1)index:获取或设置Series的索引(2)values:返回Series中的数据(4)name:获取或设置Series的名称(3)dtype:获取Series中数据的数据类型说明:Series提供了强大的索引功能,既支持类似NumPy的位置索引,也支持标签索引。利用Series对象的索引可以进行切片操作,得到Series对象。第10章Pandas库的使用10.2.1Series:带标签的一维数组10.2Pandas数据结构3.Series对象的方法Series对象的方法(5)describe():生成Series的描述性统计信息(1)head(n):获取Series的前n个数据。(2)tail(n):获取Series的后n个数据(4)max()、min()等,用于计算最大值和最小值(3)sum()、mean()用于计算总和和平均值4.向量化运算importpandasaspds1=pd.Series([1,2,3],index=['a','b','c'])s2=pd.Series([4,5,6],index=['b','c','d'])print(s1+s2)#输出:a:NaN,b:6,c:8,d:NaN按标签进行加法运算【例10.1】第10章Pandas库的使用10.2.2DataFrame:二维表格型数据结构importpandasaspdimportpandasaspdgroupOne={'name':['赵红','钱明','孙强','李刚'],'age':[18,19,20,18],'gender':['女','男','男','男']}#字典idx=['s01','s76','s29','s36']df=pd.DataFrame(groupOne,index=idx)#创建DataFrameprint(df)10.2Pandas数据结构1.创建DataFrame对象DataFrame语法格式:DataFrame(data,index=None,columns=None,dtype=None)参数说明:data:指定数据源,可以是字典、列表、数组等;index:用于指定行索引,默认自动生成整数索引0,1,2,...;columns:用于指定列标签,默认自动生成0,1,2,...;dtype:强制指定数据类型。【例10.3】2.DataFrame对象的主要属性DataFrame对象的主要属性有:(1)index:返回

DataFrame

的行索引。(2)columns:返回

DataFrame

的列索引,即列名。(3)shape:返回一个元组,包含

DataFrame

的行数和列数。(4)values:以NumPy数组的形式返回

DataFrame

中的数据。(5)dtypes:返回一个

Series,包含

DataFrame

每列的数据类型。(6)empty:若

DataFrame

为空,则返回

True,否则返回

False。(7)size:返回

DataFrame

中元素的总数,即行数乘以列数。(8)loc:为_LocIndexer对象,该对象具备强大的索引和切片功能,可以依据标签索引来选取

DataFrame

中的数据。3.DataFrame对象的基本方法(1)head(n)

:查看

DataFrame

的前

n

行数据,n

默认为5。返回DataFrame对象。(2)

tail(n):查看

DataFrame

的后

n

行数据,n

默认为5。返回DataFrame对象。10.3数据操作基础10.3.1数据输入与输出10.3.2数据清洗与预处理10.3.3数据合并与连接10.3.4数据查询与筛选10.3.5数据排序10.3.6数据重塑与透视10.3.7数据采样第10章Pandas库的使用10.3.1数据输入与输出10.3数据操作基础1.

数据源Pandas提供了丰富的数据读写接口,支持从多种数据源加载和保存数据。类型说明pands读取方法pandas写入方法csv、txt用逗号分隔、tab分隔的纯文本文件read_csvto_csvexcelxls类型或xlsx类型的文件read_excelto_excelmysql关系型数据库表read_sql.to_sqljson从JSON格式数据read_jsonto_json2.JSON数据的结构JSON数据的常见结构有五种:split结构、records结构、index结构、columns结构和values结构。sidnameagecity0WDong20CS1LYing18WH2XFong19HR例10.2数据表第10章Pandas库的使用10.3.1数据输入与输出10.3数据操作基础3.从JSON格式的文件中读取数据——输入数据read_json语法格式:read_json(path_or_buf,orient=None,lines=False)参数说明:path_or_buf:指定JSON数据路径或文件对象,可以是本地路径、URL、文件缓冲区等;orient:指定JSON数据的结构格式,默认为None(自动推断)。常见选项有:'split'、'records'、'index'、'columns'、'values';lines:如果为True,则表示JSON文件是每行一个JSON对象的格式,默认为False。4.保存数据到JSON文件中——输出数据to_json语法格式:to_json(path_or_buffer,orient,lines,index=True,encoding='utf-8',indent=None)参数说明:path_or_buffer:输出的文件路径或文件对象,若为None,则返回JSON字符串。orient:指定JSON格式结构,支持split、records、index、columns、values结构,None(默认是columns)。lines:若为True,则每行输出一个JSON对象,适合处理大型数据集;默认为False。encoding:输出文件的编码格式,默认值为'utf-8'。index:仅在orient为'split'时有效。若为True,则包含行索引;若为False,则不包含行索引,默认值为True。indent:参数用于控制生成的JSON字符串的缩进格式,主要影响输出文件的可读性。当indent设置为非零值时,输出的JSON数据会以美观的格式展示,便于阅读;若设置为0或不设置,则输出为紧凑格式。第10章Pandas库的使用10.3.2数据清洗与预处理10.3数据操作基础1.缺失值处理(1)检查缺失值使用DataFrame对象的isna或isnull方法检查缺失数据。用于检测数据中的缺失值(如NaN、NaT等),该方法会返回一个与原DataFrame形状相同的布尔型DataFrame对象,其中每个元素对应原DataFrame中的元素,若原元素为缺失值,则返回True,否则返回False。参数说明:axis:指定要删除的行还是列,默认为0,表示删除行。1表示删除列。how:指定删除缺失值的条件,可选值为'any'和'all'。'any'表示只要存在缺失值就删除,'all'表示只有当所有值都是缺失值时才删除。thresh:指定一个阈值,表示要保留的行或列中至少有多少个非缺失值。这个参数与how互斥,如果设置了thresh,则how参数将被忽略。subset:指定要考虑哪些列或行。inplace:是否直接修改DataFrame,默认为False,不修改DataFrame,而是返回一个新的DataFrame对象。(2)删除缺失值删除包含缺失值的行或列。如果数据中的缺失值过多,比如缺失值数据比例占比超过30%,可以删除包含缺失值的行或列,可以使用DataFrame对象的dropna方法删除包含缺失值的行或列。dropna语法格式:dropna(axis=0,how='any',thresh,subset,inplace=False)第10章Pandas库的使用10.3.2数据清洗与预处理10.3数据操作基础1.缺失值处理(3)填充缺失值如果数据中的缺失值较少,可以考虑填充缺失值,可以使用DataFrame对象的fillna方法填充缺失值。参数说明:value:用于填充的值。method:填充空值的方法。可以是'backfill','bfill','pad','ffill',None。默认值为None。'pad'或'ffill'表示用前面行或列的值,'backfill'或'bfill'表示用后面行或列的值,不能与`value`同时使用。axis:为0或'index'表示按行删除;1或'columns'表示按列删除。inplace:是否原地替换,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。limit:如果method被指定,表示连续填充缺省值的最大次数。fillna语法格式:fillna(value,method,axis,limit,inplace=False)【例10.6】缺失值处理importpandasaspdimportnumpyasnp#1.创建含缺失值的示例数据data={'姓名':['张三','李四','王五','赵六'],'年龄':[25,np.nan,32,28],'薪资':[8000,8200,np.nan,9500],'部门':['销售',np.nan,'技术','市场']}df=pd.DataFrame(data)print("原始数据:")print(df)#2.删除原则示例df_drop=df.dropna(subset=['薪资'])#删除"薪资"列缺失的行(保留其他列缺失的行)print("\n删除缺失薪资记录后:")print(df_drop)#3.填充原则示例#数值列用中位数填充df_fill=df.copy()df_fill['年龄']=df_fill['年龄'].fillna(df_fill['年龄'].median())df_fill['部门']=df_fill['部门'].fillna('未知')#分类列用"未知"填充print("\n填充缺失值后:")print(df_fill)#4.标记原则示例df_mark=df.copy()df_mark['薪资_缺失']=df_mark['薪资'].isna()#添加缺失标识列第10章Pandas库的使用10.3.3数据合并与连接10.3数据操作基础1.使用concat方法Pandas库的concat方法用于沿一个轴拼接多个对象。参数说明:objs:可以是Series、DataFrame对象组成的列表、元组等。axis:指定拼接的轴,可选值为0或'index'(默认值),表示按行拼接;1或'columns'表示按列拼接。join:指定拼接时的索引处理方式,可选值为'outer'(默认值,取并集)和'inner'(取交集)。ignore_index:默认值为False。如果设置为True,则在拼接后会重新生成连续的整数索引;如果设置为False,则保留原索引。verify_integrity:默认值为False。如果设置为True,则在拼接前会检查拼接的对象的索引是否有重复,如果有重复会抛出ValueError异常。sort:默认值为False。控制在拼接操作完成后,是否对行索引(当axis=1按列拼接时)或列名(当axis=0按行拼接时)进行排序。concat的语法格式:concat(objs,axis=0,join='outer',ignore_index=False,verify_integrity=False,sort=False,copy=True)【例10.17】importpandasaspddf1=pd.DataFrame({'A':[1,2],'B':[3,4]})df2=pd.DataFrame({'A':[5,6],'B':[7,8]})result=pd.concat([df1,df2])#按行拼接,行索引未重置print(result)result=pd.concat([df1,df2],axis=1)#按列拼接print(result)df3=pd.DataFrame({'B':[3,4],'C':[5,6]})result=pd.concat([df1,df3],join='inner')#使用inner(取交集)按行拼接print(result)df4=pd.DataFrame({'B':[3,4],'A':[5,6]})result=pd.concat([df1,df4],sort=True)#按行拼接,对列名排序print(result)第10章Pandas库的使用10.3.3数据合并与连接10.3数据操作基础2.使用merge方法merge方法是Pandas中用于合并两个DataFrame对象。参数说明:left和right:要合并的两个DataFrame或Series对象。how:指定合并的方式,可选值有'inner'(默认值,取交集)、'outer'(取并集)、'left'(保留左侧表所有行,右侧无匹配则填充NaN)、'right'(保留右侧表所有行,右侧无匹配则填充NaN)。on:指定用于合并的列名,该列必须同时存在于left和right两个DataFrame中。如果不指定,则会自动寻找两个DataFrame中相同的列名作为合并键。和right_on:当left和right两个DataFrame中用于合并的列名不同时,可以使用left_on指定left中用于合并的列名,right_on指定right中用于合并的列名。sort:默认值为False。如果设置为True,则会对合并后的结果按合并键进行排序。merge语法格式:merge(left,right,how='inner',on=None,left_on=None,right_on=None,sort=False,suffixes=('_x','_y'),copy=True)【例10.18】缺失值处理importpandasaspddf1=pd.DataFrame({'ID':['s1','s2','s3'],'Name':['赵红','钱明','李强']})df2=pd.DataFrame({'ID':['s2','s3','s4'],'Score':[90,85,88]})result=pd.merge(df1,df2,on='ID')#内连接(默认),仅保留'ID'列相同的行print(result)result=pd.merge(df1,df2,on='ID',how='left')#保留左侧所有行,右侧无匹配为NaNprint(result)df3=pd.DataFrame({'eID':['s1','s2','s3'],'Dept':['数计','物理','美术']})#不同键名合并,左侧df2用'ID',右侧df3用'eID'合并result=pd.merge(df2,df3,left_on='ID',right_on='eID',how='left')print(result)#外连接,保留所有数据,无匹配则为NaNresult=pd.merge(df1,df2,on='ID',how='outer')print(result)第10章Pandas库的使用10.3.4数据查询与筛选10.3数据操作基础1.按条件提取数据子集【例10.19】缺失值处理#单条件筛选,布尔索引(df[condition])---筛选技术部员工tech_team=df[df['部门']=='技术']#多条件组合,逻辑&运算---筛选技术部小于30岁的员工young_tech=df[(df['部门']=='技术')&(df['年龄']<27)]#模糊查询,字符串方法(.str.contains())---筛选姓'王'的员工name_contains_z=df[df['姓名'].str.contains('王')]本节采用如下DataFrame作为示例数据集:importpandasaspd#示例数据df=pd.DataFrame({'姓名':['张三','李四','王五'],'年龄':[25,30,28],'部门':['技术','销售','技术']},index=['A001','A002','A003'])第10章Pandas库的使用10.3.4数据查询与筛选10.3数据操作基础2.行列选择与索引操作(1)loc:基于标签的索引参数说明:row_selection:控制行的筛选,可以是单个标签、标签列表、标签切片或布尔条件;col_selection:控制列的筛选,与行选取方式类似,但作用于列维度。loc语法格式:loc[row_selection,col_selection]【例10.20】loc在DataFrame中的使用importpandasaspdd={'a':10,'b':20,'c':30,'d':40,'e':50}s=pd.Series(d)#从字典创建Seriesprint(s.loc[['a','c']])#输出包含10、30的Series对象print(s.loc['a':'c'])#输出包含10、20、30的Series对象print(s.loc[s>20])#输出包含30、40、50的Series对象s.loc[['a','c']]=[15,35]#可以使用loc修改数据loc通过显式标签(如列名或索引名)进行数据选择,切片范围包含结束标签。【例10.19】loc在Series中的使用#df为示例操作数据df.loc['A002','姓名']#选择A002行的姓名df.loc[:,'姓名':'部门']

#从所有行中选择从姓名到部门所有列数据df.loc[df['年龄']>25,['姓名','部门']]

#选择年龄大于25岁的人的姓名和所在部门第10章Pandas库的使用10.3.4数据查询与筛选10.3数据操作基础2.行列选择与索引操作(2)iloc:基于位置的索引参数说明:row_indexer和column_indexer分别用于指定行和列的选取方式,可以是单个整数、整数列表、切片对象,但不能是标签或条件表达式,iloc语法格式:iloc[row_indexer,column_indexer]【例10.23】iloc在DataFrame中的使用importpandasaspdd=[10,20,30,40]s=pd.Series(d) #创建Seriesprint(s.iloc[-1]) #输出:40print(s.iloc[[0,-1]])#输出包含10、40的Series对象print(s.iloc[[True,True,False,False]])#输出包含10、20的Series对象s.iloc[1]=7#修改数据s.iloc[[0,2]]=[15,35]#修改数据iloc通过整数位置(从0开始)进行数据选择,切片范围不包含结束位置,例如0:2会选中第0行和第1行,该方法仅支持整数、整数列表或切片作为索引参数,不能直接使用条件表达式进行筛选。【例10.22】iloc在Series中的使用#df为示例操作数据print(df.iloc[1])#选中索引为1的行print(df.iloc[0,1])#行索引为0、列索引为1print(df.iloc[0:2,:])#行索引为0和1(不含2),所有列print(df.iloc[[0,2],[1,2]])#行索引为0和2,列索引为1和2第10章Pandas库的使用10.3.5数据排序10.3数据操作基础1.按值进行排序(1)Series数据的按值排序参数说明:ascending:默认值为True,按升序排序;inplace:若为True,则直接在原Series上进行排序,返回None;若为False,则返回一个新的排序后的Series,原Series保持不变。na_position:指定缺失值的位置,可选值'last'为默认值,缺失值放在排序后的末尾,若为'first',则把缺失值放在排序后的开头。ignore_index:若为True,则排序后会重新生成连续的整数索引;若为False,则保留原索引。key:可调用对象(如函数),默认值为None。该函数会应用于Series的每个元素,然后根据函数返回值进行排序。语法格式:sort_values(ascending=True,inplace=False)sort_values(ascending=True,inplace=False,na_position='last',ignore_index=False,key=None)importpandasaspds=pd.Series([-23,61,-54,72])s_key=s.sort_values(key=lambdax:abs(x))#根据绝对值排序print(s_key)【例10.24】(2)DataFrame的按值排序语法格式:sort_values(by,axis=0,ascending=True,inplace=False,na_position='last',ignore_index=False,key=None)【例10.25】importpandasaspddata={'Name':['Ab','Bb','Ce','Dc'],'Age':[25,20,30,20],'Score':[85,90,75,60]}df=pd.DataFrame(data)df1=df.sort_values(by='Age') #根据'Age'列排序print(df1)df2=df.sort_values(by=['Age','Score'])#先按'Age'列,再按'Score'列排序print(df2)第10章Pandas库的使用10.3.5数据排序10.3数据操作基础2.按索引排序sort_index语法格式:sort_index(axis=0,level=None,ascending=True,inplace=False,kind='quicksort',na_position='last',sort_remaining=True,ignore_index=False,key=None)nlargest和nsmallest的语法格式:nlargest(n,columns,keep)、nsmallest(n,columns,keep)【例10.27】importpandasaspddata={'A':[3,1,4,2,5,4],'B':[10,20,30,40,50,40]}df=pd.DataFrame(data)print(df)d1=df.nlargest(n=2,columns='A')print(d1)d2=df.nlargest(n=2,columns=['A','B'])#按多列选取最大元素所在行print(d2)【例10.26】importpandasaspddata={'Ac':[1,2,3],'Ab':[4,5,6]}df=pd.DataFrame(data,index=['c','a','b'])df1=df.sort_index(axis=0) #按行索引排序print(df1)df2=df.sort_index(axis=1) #按列索引排序print(df2)3.使用nlargest和nsmallest方法两种方法可以获取最大或最小值及其前N行数据。第10章Pandas库的使用10.3.6数据重塑与透视10.3数据操作基础1.pivot_table方法pivot_table语法格式:pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False)【例10.28】importpandasaspdproducts={'category':['A','B','A','B','A','C'],'quantity':[10,20,30,40,50,60],'price':[1,2,3,4,5,6],'date':['2025-01','2025-01','2025-02','2025-02','2025-03','2025-03']}df=pd.DataFrame(products)print(df)pivot=pd.pivot_table(df,values=['price','quantity'],index='category',columns='date',aggfunc={'price':'mean','quantity':'sum'},fill_value=0,margins=True)数据重塑和透视是数据处理的重要手段,能有效改变数据的结构以满足不同分析需求。参数说明:data:为原始DataFrame数据;values:为待聚合的数值列;index:指定行分组键;columns:指定列分组键;aggfunc:设定聚合函数(默认均值为mean);fill_value:指定填充缺失值;margins指定是否添加总计。第10章Pandas库的使用10.3.6数据重塑与透视10.3数据操作基础2.pivot方法pivot语法格式:pivot(columns,index,values)【例10.29】importpandasaspddata={'Name':['WQ','TH','CK'],'Math':[85,90,78],'English':[92,88,85],'Science':[79,83,91]}df=pd.DataFrame(data)#创建一个宽格式的DataFrameprint("宽格式DataFrame:")print(df)#使用pd.melt()将数据转换为长格式mf=pd.melt(df,id_vars=['Name'],value_vars=['Math','English','Science'],var_name='Subject',value_name='Score')print("\n转换后的长格式DataFrame:")print(mf)参数说明:columns:指定新DataFrame对象的列标签;index:指定新DataFrame对象的行标签。如果不指定,将使用原DataFrame的索引;values指定填充到新DataFrame对象中的数据列名。如果不指定,原DataFrame中除index和columns列之外的所有列都会被使用。3.melt方法melt语法格式:melt(df,id_vars,value_vars,var_name='variable',value_name='value')参数说明:df:指定要处理的数据集;id_vars:指定保持不变的列;value_vars:指定需要转换的列名,如果剩下的列全部都要转换,可缺省;var_name:指定转换后包含原列名的新列的名称,默认值为'variable';value_name:指定转换后包含原列值的新列的名称,默认值为'value'。【例10.30】importpandasaspddata={'Name':['Alice','Bob','Alice','Bob'],'Subject':['Math','Math','English','English'],'Score':[85,90,80,75]}df=pd.DataFrame(data)#Name列作为行索引,Subject列作为列索引,Score列的值填充到新的DataFrame中pf=df.pivot(index='Name',columns='Subject',values='Score')print(pf)第10章Pandas库的使用10.3.7数据重塑与透视10.3数据操作基础1.简单随机采样sample语法格式:sample(n=None,frac=False,replace=False,weights=None,random_state=None,axis=0,igore_index=False)importpandasaspddf=pd.DataFrame({'A':range(10),'B':['x']*5+['y']*5})print(df)d1=df.sample(n=3)#随机抽取3行d2=df.sample(frac=0.3,replace=False)#按30%比例无放回抽样d3=df.sample(n=1,axis=1)#按列抽样(随机选1列)#加权抽样(B列中'y'权重更高)d4=df.sample(n=3,weights=[0.1ifval=='x'else0.9forvalindf['B']])参数说明:n:抽取样本行数或列数,frac:抽取比例,相对于总行数或列数,其值在0~1之间。两个参数二选一,都省略,取一行。replace:否放回抽样,默认为False,表无放回抽样,即每个样本只抽一次。weights:样本权重,指定每个样本被抽中的概率。random_state:指定随机种子以确保结果可复现。axis:抽样维度,'0'表示对行抽样,'1'表示对列抽样。ignore_index:是否重置采样结果的索引。【例10.31】10.4数据分析基础10.4.1数据分组与聚合10.4.2数据统计第10章Pandas库的使用10.4.1数据分组与聚合10.4数据分组与聚合1.使用groupby方法进行分组操作groupby语法格式:groupby(by,as_index=True,sort=True)importpandasaspddata={'Name':['WB','LY','CF','AM'],'Score':[85,90,75,80],'Sub':['M','M','E','E']}df=pd.DataFrame(data)gp=df.groupby('Sub')#按'Sub'列分组forname,gingp:print(f"组名:{name}")print(g)参数说明:by:指定分组的依据,可以是列名或列名列表、函数、字典或Series。如果是函数,将函数应用于索引,依据函数的返回值分组,如果是字典或Series的索引,则要求与DataFrame的索引匹配,按照对应的值分组;as_index:默认True,分组键作为结果的索引;若为False,分组的键会作为结果的列;sort:默认值为True,对分组的键进行排序。否则不排序。【例10.33】第10章Pandas库的使用10.4.1数据分组与聚合10.4数据分组与聚合2.常用的聚合函数importpandasaspdproducts={'category':['A','B','A','B','A','C'],'quantity':[10,20,30,40,50,60],'price':[1,2,3,4,5,6]}df=pd.DataFrame(products)result=df.groupby('category')['quantity'].sum()print(result)常用的聚合函数有求和sum、均值mean、中位数median、最小值min、最大值max、标准差std、方差var、非空计数count、组大小(含空值)siz、唯一值数量nunique、组内第一个first、最后一个值last、分位数quantile等。【例10.34】3.使用agg()多聚合函数【例10.35】对例10.34的"quantity"列同时计算总和、均值、最大值、中位数、计数。importpandasaspdproducts={'category':['A','B','A','B','A','C'],'quantity':[10,20,30,40,50,60],'price':[1,2,3,4,5,6]}df=pd.DataFrame(products)result=df.groupby('category')['quantity'].sum()print(result)第10章Pandas库的使用10.4.1数据分组与聚合10.4数据分组与聚合4.使用transform方法Transform方法是DataFrame对象的一个方法,主要作用是对DataFrame或Series中的数据进行转换操作。【例10.36】importpandasaspd,numpyasnpdata={'A':[1,2,3,4],'B':[5,6,7,8]}df=pd.DataFrame(data)print(df)print("+++++++++++++++++++++++++++")t=df.transform(lambdax:2*x)#使用自定义函数进行转换print(t)data={'Group':['A','A','B','B'],'Value':[10,20,30,40]}dg=pd.DataFrame(data)print("+++++++++++++++++++++++++++")print(dg)#按'Group'列分组,计算每组的均值并广播到每组的每一行g=dg.groupby('Group')['Value'].transform('mean')dg['Group_Mean']=gprint("+++++++++++++++++++++++++++")print(dg)functions=[np.sqrt,np.square]t=df.transform(functions) #使用函数列表进行转换print("+++++++++++++++++++++++++++")print(t)d={'A':np.sqrt,'B':np.square}t=df.transform(d) #使用字典指定不同列的转换函数print("+++++++++++++++++++++++++++")print(t)transform语法格式:transform(func,axis=0,*args,**kwargs))参数说明:func:可以是函数,用于对数据进行转换;可以是字符串,例如pandas内置的函数名;可以是函数列表,传入多个函数,对数据依次应用这些函数进行转换;可以是字典,键为列名,值为函数。函数列表或字符串,表示对指定列应用相应的转换函数;Axis:指定转换的轴,0表示按列进行转换,默认值为0,1表示按行进行转换;*args和**kwargs:为可选参数,用于传递给func函数的额外位置参数和关键字参数。第10章Pandas库的使用10.4.1数据分组与聚合10.4数据分组与聚合5.使用filter分组后数据过滤Transform方法是DataFrame对象的一个方法,主要作用是对DataFrame或Series中的数据进行转换操作。【例10.37】importpandasaspddata={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}df=pd.DataFrame(data,index=['row1','row2','row3'])fd=df.filter(items=['A','C'],axis=1)#筛选列'A'和'C'print(fd)fs=df.filter(items=['row1','row3'],axis=0)#筛选行'row1'和'row3'print(fs)fs=df.filter(like='A')#筛选包含'A'的列print(fs)fs=df.filter(regex='^A')#筛选列名以'A'开头的列print(fs)filter语法格式:filter(items,like,regex,axis=0)参数说明:items:列表,列表元素为要筛选的列名或行索引;like:字符串,用于筛选包含指定字符串的列名或行索引;regex:正则表达式字符串,用于筛选符合正则表达式的列名或行索引;axis:指定筛选的轴,0或'index'表示按行筛选,1或'columns'表示按列筛选(默认为0)。注意,在大多数情况下,我们按列筛选,所以常用axis=1。第10章Pandas库的使用10.4.2数据统计10.4数据分组与聚合1.汇总类统计(1)描述性统计DataFrame对象的describe方法用于生成DataFrame中数值列的统计摘要,提供每一列的若干描述性统计量。如计数、均值、标准差、最小值、四分位数和最大值等。【例10.38】创建一个DataFrame,存放四名学生的姓名、年龄和某门课程的成绩,使用df.describe(),查看生成的统计摘要。importpandasaspdgroupOne={'name':['赵红','钱明','孙强','李刚'],'age':[18,19,20,15],'score':[90,78,100,85]}df=pd.DataFrame(groupOne)description=df.describe()#使用describe()方法查看统计摘要print(description)describe语法格式:describe(percentiles,include=None,exclude=None)参数说明:percentiles:指定要计算的分位数,默认值为[.25,.5,.75],即计算25%、50%和75%分位数;include:指定要包含在统计结果中的数据类型。默认情况下只会对数值类型的列进行统计,可以传入以下值:'all'(包含所有列)、数据类型列表(如['object','int64'],表示只包含指定数据类型的列;exclude:指定要从结果中排除的数据类型。第10章Pandas库的使用10.4.2数据统计10.4数据分组与聚合1.汇总类统计(2)mean方法mean方法计算每列的均值,对于非数值列则会报错。【例10.39】importpandasaspddata={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}df=pd.DataFrame(data)col_mean=df.mean(axis=0) #按列计算平均值print(col_mean)row_mean=df.mean(axis=1) #按行计算平均值print(row_mean)mean语法格式:mean(axis=0,skipna=True,numeric_only=True)参数说明:axis:指定计算平均值的轴,默认值为0,对每列的数据进行平均计算。值为1时,是计算每行的数据的平均值;skipna:默认值为True,忽略缺失值。若为False,只要某列或某行存在缺失值,计算结果就会为NaN;numeric_only:默认值为True,只对数值类型计算平均值;若为False,会尝试对所有列计算平均值,但对于非数值列可能会报错。(3)median方法median方法计算每列的中位数,即排序后位于中间位置的值。如果数据个数为偶数,则取中间两个数的平均值。参数说明:参阅mean方法的同名参数median语法格式:median(axis=0,skipna=True,numeric_only=True)第10章Pandas库的使用10.4.2数据统计10.4数据分组与聚合1.汇总类统计(4)mode方法mode方法计算每列的众数,即出现次数最多的值,可能会有多个众数。mode语法格式:mode(axis=0,skipna=True,numeric_only=True)参数说明:参阅mean方法的同名参数(5)median方法median方法计算每列的中位数,即排序后位于中间位置的值。如果数据个数为偶数,则取中间两个数的平均值。参数说明:参阅mean方法的同名参数median语法格式:median(axis=0,skipna=True,numeric_only=True)(5)std方法std计算每列的标准差,反映数据相对于均值的离散程度。std语法格式:std(axis=0,skipna=True,numeric_only=True,ddof=1)参数说明:ddof表示自由度的调整量,默认值为1。在统计学中,计算样本标准差时通常使用n-1作为分母,其中n为样本数量,这里的1就是ddof的值;若要计算总体标准差,可将ddof设置为0。其他参数参阅mean方法的同名参数。(6)var方法var方法计算每列的方差,是标准差的平方。参数说明:参阅std方法的同名参数。var语法格式:var(axis=0,skipna=True,numeric_only=True,ddof=1)第10章Pandas库的使用10.4.2数据统计10.4数据分组与聚合1.汇总类统计(7)min和max方法min和max方法分别计算每列的最小值和最大值。min和max语法格式:min(axis=0,skipna=True,numeric_only=True)max(axis=0,skipna=True,numeric_only=True)参数说明:参阅std方法的同名参数。(8)quantile方法quantile方法用于计算数据的分位数。分位数是将数据按从小到大排序后分割成若干等份的数值点,例如中位数就是第50百分位数(即0.5分位数)。quantile语法格式:quantile(q=0.5,axis=0,numeric_only=True,interpolation=’linear’,method='single')参数说明:q:表示要计算的分位数,可以是单个浮点数(取值范围在0到1之间),也可以是包含多个浮点数的列表或数组,用于同时计算多个分位数。默认值为0.5,即计算中位数。interpolation:当分位数的位置不是整数时,用于指定插值方法,可选值有'linear'(线性插值,默认值)、'lower'、'higher'、'midpoint'、'nearest'等,不同的插值方法会影响分位数的计算结果。method:指定当分位数位于两个数据点之间时的计算方法,是可选项,默认值为'single',不同的方法可能会导致计算结果略有差异【例10.40】importpandasaspddata={'A':[1,2,3,4,5],'B':[6,7,8,9,10]}df=pd.DataFrame(data)median=df.quantile(0.5) #计算中位数(0.5分位数)print(median)quantiles=df.quantile([0.25,0.5,0.75])#计算0.25、0.5和0.75分位数print(quantiles)#使用不同的插值方法计算0.2分位数quantile_linear=df.quantile(0.2,interpolation='linear')quantile_lower=df.quantile(0.2,interpolation='lower')print("使用线性插值计算的0.2分位数:",quantile_linear)print("使用lower插值计算的0.2分位数:",quantile_lower)第10章Pandas库的使用10.4.2数据统计10.4数据分组与聚合2.唯一性去重和按值计数(1)unique方法unique方法没有参数,用于获取Series或者Index对象里的唯一值,此方法能去除重复值,并且返回包含唯一值的数组。value_counts语法格式:value_counts(normalize=False,sort=True,ascending=False,bins=None,dropna=True)参数说明:normalize:默认为False。若为True,则返回每个唯一值的频率,即出现次数占总次数的比例,而不是具体的计数。sort:默认为True,按照计数结果进行排序。ascending:默认为False,按降序排序,bins:整数或序列,将数据划分为指定数量的等宽区间或自定义区间,并统计每个区间内值的数量,默认为None。dropna:若为False,则会将NaN也作为一个唯一值进行计数。【例10.41】importpandasaspddata=pd.Series([1,2,2,3,3,3,4,4,4,4])unique_values=data.unique()print("Series中的唯一值:",unique_values)datas={'A':[1,2,2,3,3,3,4,4,4,4],'B':['a','b','b','c','c','c','d','d','d','d']}df=pd.DataFrame(datas)s=df['B'].unique() #获取'B'列的唯一值print("'B'列的唯一值:",s)(2)value_counts方法value_counts方法用于统计Series或Index对象中每个唯一值的出现次数。【例10.42】importpandasaspddata=pd.Series([1,2,2,3,3,3,4,4,4,4])counts=data.value_counts() #统计每个唯一值的出现次数print(counts)frequencies=data.value_counts(normalize=Trueprint(frequencies)binned_counts=data.value_counts(bins=2)print(binned_counts)datas={'A':[1,2,2,3,3,3,4,4,4,4],'B':['a','b','b','c','c','c','d','d','d','d']}df=pd.DataFrame(datas)b_counts=df['B'].value_counts() print(b_counts)第10章Pandas库的使用10.4.2数据统计10.4数据分组与聚合3.相关系数和协方差(1)cov方法cov方法用于计算协方差矩阵。协方差衡量的是两个变量的总体误差,体现了两个变量的变化趋势是否一致。corr语法格式:corr(other,method='pearson',min_periods=None)参数说明:0ther:仅在Series对象时可用,指定另一个Series对象;method:指定计算相关系数的方法,默认值为'pearson'(皮尔逊相关系数),还可以选择'kendall'(肯德尔秩相关系数)和'spearman'(斯皮尔曼秩相关系数);min_periods:指定每个列对所需的最小观测值数量,只有当观测值数量达到该值时才会计算相关系数。cov语法格式:DataFrame.cov(min_periods=None) Series.cov(other,min_periods=None)参数说明:other:仅在Series对象时可用,指定另一个Series对象;min_periods:指定每个列对所需的最小观测值数量,只有当观测值数量达到该值时才会计算协方差,默认值为None。【例10.43】importpandasaspddata={'A':[1,2,3,4,5],'B':[5,4,3,2,1],'C':[2,4,6,8,10]}df=pd.DataFrame(data)cov_matrix=df.cov() #计算DataFrame的协方差矩阵print(cov_matrix)a=df['A'];b=df['B']cov_ab=a.cov(b) #计算两个Series之间的协方差print(cov_ab)

print(b_counts)(2)corr方法corr方法用于计算相关系数矩阵。相关系数是标准化后的协方差,取值范围在-1到1之间,能更直观地反映两个变量之间线性关系的强弱和方向。10.5综合应用案例案例18:使用Series对象保存库存量案例19:使用Series对象保存库存量第10章Pandas库的使用案例18:使用Series对象保存库存量10.5综合应用案例【问题描述】某电商平台需要记录新款智能手环在华北地区各城市首日库存量。华北地区有北京,天津,石家庄,太原,呼和浩特共五个仓库,编码分别是BJ、TJ、SJZ、TY、HHHT,每个仓库的库存量分别是42、35、28、30和25只。要求:1.创建包含工作日索引的库存量Series。2.用仓库编码作为Series的索引,用日期为Series命名。3.程序输出效果:4.当日各仓库库存情况:BJ42TJ35SJZ28TY30HHHT25Name:2025-3-01库存量,dtype:int64importpandasaspddatas=[42,35,28,30,25]codes=['BJ','TJ','SJZ','TY','HHHT']#使用自定义索引创建Seriesstock=pd.Series(datas,index=codes)='2025-3-01库存量'print("当日各仓库库存情况:")print(stock)【参考代码】第10章Pandas库的使用案例19:使用DataFrame保存客户订单信息10.5综合应用案例【问题描述】为某个产品创建客户订单信息的表格DataFrame,订单信息见表10.2。要求:1.订单号、用户ID.所在城市、单价、数量、订货时间依次对应DataFrame的列标签:order_iD.customer_iD.city、price、quantity、order_time。2.使用时间序列函数处理订货时间。3.客户订单信息先保存到字典中,根据该字典创建DataFrame对象。订单号为行索引。4,添加计算列,计算每一单的总金额。importpandasaspddt=pd.date_range('2023-12-0108:00',periods=4)orders={'order_id':['X1001','X1002','X1003','X1004'],'customer_id':['cu13579','cu24680','cu35791','cu46802'],'city':['北京','天津','石家庄','太原'],'quantity':[2,1,3,2],'price':[5,4.5,4,5],'order_time':dt}order_df=pd.DataFrame(orders)#创建DataFrameorder_df.set_index('order_id')#设置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论