




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1云南財(cái)經(jīng)大學(xué)信息學(xué)院
Python數(shù)據(jù)分析及應(yīng)用第七章Pandas數(shù)據(jù)分析目錄
7.1Pandas數(shù)據(jù)結(jié)構(gòu)7.2DataFrame數(shù)據(jù)的基本操作7.3數(shù)據(jù)的導(dǎo)入與導(dǎo)出7.4數(shù)據(jù)的預(yù)處理7.5數(shù)據(jù)分組統(tǒng)計(jì)7.6創(chuàng)建透視表和交叉表(1)知識(shí)目標(biāo):掌握Pandas的兩種數(shù)據(jù)結(jié)構(gòu)及其基本操作、掌握DataFrame數(shù)據(jù)的基本操作,即數(shù)據(jù)的查改增刪、掌握Pandas的數(shù)據(jù)導(dǎo)入與導(dǎo)出操作、掌握數(shù)據(jù)分析前的常用預(yù)處理操作、掌握Pandas中的數(shù)據(jù)分組、聚合以及統(tǒng)計(jì)操作、掌握Pandas中數(shù)據(jù)透視表和交叉表的創(chuàng)建方法。(2)技能目標(biāo):具備一定的數(shù)據(jù)分析和處理能力,能夠運(yùn)用Pandas高效地處理數(shù)據(jù)集、能夠利用Pandas進(jìn)行數(shù)據(jù)統(tǒng)計(jì)分析,如描述性統(tǒng)計(jì)、分組統(tǒng)計(jì)等,為數(shù)據(jù)分析和數(shù)據(jù)挖掘提供有力支持;具備一定的問(wèn)題解決能力,面對(duì)實(shí)際的數(shù)據(jù)處理問(wèn)題時(shí),能夠迅速分析并找到解決方案,利用Pandas工具集進(jìn)行實(shí)踐。(3)素質(zhì)目標(biāo):保持對(duì)新技術(shù)和新方法的關(guān)注,持續(xù)學(xué)習(xí);在處理復(fù)雜數(shù)據(jù)時(shí),能夠保持清晰的邏輯思維,有條理地進(jìn)行數(shù)據(jù)分析和處理;數(shù)據(jù)處理工作往往繁瑣且需要高度細(xì)致,能夠保持耐心和細(xì)心,確保數(shù)據(jù)處理的準(zhǔn)確性和完整性。3學(xué)習(xí)目標(biāo)
銷售數(shù)據(jù)如同一面鏡子,清晰地映射出顧客需求、市場(chǎng)變化以及經(jīng)營(yíng)策略的有效性。為提升顧客滿意度,增強(qiáng)市場(chǎng)競(jìng)爭(zhēng)力,對(duì)銷售數(shù)據(jù)進(jìn)行分析顯得很重要。本章將圍繞小型商店的近期銷售數(shù)據(jù),通過(guò)pandas的數(shù)據(jù)分析技術(shù),分析哪些商品受顧客青睞、每天的銷售總額、每類商品的售出數(shù)量有何變化等。
通過(guò)本章的學(xué)習(xí),您將掌握如何使用Pandas輕松應(yīng)對(duì)各種數(shù)據(jù)處理挑戰(zhàn),系統(tǒng)地學(xué)習(xí)Pandas的基礎(chǔ)知識(shí),從核心數(shù)據(jù)結(jié)構(gòu)DataFrame和Series的創(chuàng)建與操作開(kāi)始,逐步深入到數(shù)據(jù)的導(dǎo)入與導(dǎo)出、清洗與轉(zhuǎn)換、聚合與篩選、排序與索引等高級(jí)功能。4本章導(dǎo)讀Pandas主要提供了兩種數(shù)據(jù)類型:Series和DataFrame,Series是一維數(shù)據(jù)結(jié)構(gòu),DataFrame是二維數(shù)據(jù)結(jié)構(gòu)。
在程序中要使用Pandas,首先需要導(dǎo)入該庫(kù),同時(shí)為方便使用,在導(dǎo)入時(shí)通常為該庫(kù)起別名為“pd”,命令為:
importpandasaspd
在jupyternotebook中,可根據(jù)需要設(shè)置數(shù)據(jù)顯示的行列數(shù),通過(guò)調(diào)用pandas的set_option()方法來(lái)實(shí)現(xiàn),如以下命令可設(shè)置在jupyternotebook中最多顯示10行8列數(shù)據(jù),超出部分使用省略號(hào)替換。pd.set_option('display.max_rows',10)pd.set_option('display.max_columns',8)57.1Pandas數(shù)據(jù)結(jié)構(gòu)
Pandas中的Series類似于一維數(shù)組或列表,但功能更為強(qiáng)大。Series對(duì)象由索引(index)和數(shù)據(jù)(data)兩部分組成的,索引也稱為數(shù)據(jù)標(biāo)簽。索引用于標(biāo)識(shí)數(shù)據(jù)的位置,可以是自動(dòng)生成的整數(shù),也可以是自定義的字符串等任意數(shù)據(jù)類型。數(shù)據(jù)部分則存儲(chǔ)了Series的實(shí)際值,可以是數(shù)值、字符串、布爾值等任意數(shù)據(jù)類型。67.1.1Series對(duì)象可以使用pandas的Series()函數(shù)創(chuàng)建Series對(duì)象,其基本語(yǔ)法為:pd.Series(data,index=None)data是必要參數(shù),指要放入Series中的數(shù)據(jù),可以是列表、數(shù)組、字典等。index是可選參數(shù),能夠自定義Series對(duì)象的索引,如果沒(méi)有指定索引,pandas會(huì)自動(dòng)創(chuàng)建從0開(kāi)始的整數(shù)索引。7(一)series的創(chuàng)建
實(shí)例7-1創(chuàng)建Series。importpandasaspddata1=[1,2,3,4,5]s1=pd.Series(data1)#使用列表創(chuàng)建Series,沒(méi)有指定索引print(s1)data2=[10,20,30,40,50]s2=pd.Series(data2,index=['A','B','C','D','E'])#創(chuàng)建Series,自定義索引print(s2)data3={'a':100,'b':200,'c':300,'d':400,'e':500}s3=pd.Series(data3)#使用字典創(chuàng)建Series,字典的鍵作為索引print(s3)
通過(guò)index屬性可以獲取Series對(duì)象的索引,values屬性可以獲取Series對(duì)象的數(shù)據(jù)值。同時(shí),與字符串、列表等數(shù)據(jù)類型一樣,Series也支持索引和切片操作,可以通過(guò)索引來(lái)選擇或修改數(shù)據(jù),也可以通過(guò)切片獲取一段范圍內(nèi)的數(shù)據(jù),得到一個(gè)新的Series數(shù)據(jù)對(duì)象。8(二)series的常用操作
實(shí)例7-2series操作。importpandasaspddata1=[1,2,3,4,5]s1=pd.Series(data1)print('s1的索引:',s1.index)print('s1的數(shù)據(jù):',s1.values)print('s1索引為0的數(shù)據(jù):',s1[0])print('s1索引為1-3的數(shù)據(jù):\n',s1[1:4])DataFrame是類似于二維數(shù)組或表格(如excel)的對(duì)象,它包含一組有序的列,每一列的數(shù)據(jù)類型是相同的,但不同列可以是不同的值類型(字符串、數(shù)字、日期時(shí)間等)。DataFrame既有行索引,又有列索引,可以看作由Series組成的字典。DataFrame包括3個(gè)基本要素,分別是索引、列、數(shù)據(jù)。在DataFrame的許多操作中,都使用了axis這一參數(shù),用于指定操作是應(yīng)用于行的方向還是列的方向,axis=0指操作應(yīng)用于行,而axis=1指操作應(yīng)用于列。97.1.2
DataFrame對(duì)象axis=0axis=1索引(index)列名(columns)數(shù)據(jù)(data)DataFrame的創(chuàng)建可以通過(guò)多種方式實(shí)現(xiàn),最常用的是通過(guò)字典、列表、文件導(dǎo)入創(chuàng)建。使用字典創(chuàng)建DataFrame時(shí),字典的鍵成為列名,字典的值(通常是列表或數(shù)組)成為對(duì)應(yīng)列的數(shù)據(jù)。使用列表創(chuàng)建DataFrame時(shí),實(shí)際上是通過(guò)列表的列表,即二維列表來(lái)創(chuàng)建,并通過(guò)使用columns屬性指定列名。10(一)DataFrame的創(chuàng)建11實(shí)例7-3創(chuàng)建DataFrame。importpandasaspd#使用字典創(chuàng)建DataFramedata1={'Name':['Tom','Jerry','Mickey','Minnie'],'Age':[18,20,22,15],'City':['北京','上海','昆明','廣州']}df1=pd.DataFrame(data1)print(df1)#使用列表的列表創(chuàng)建DataFramedata2=[['Tom',18,'北京'],['Jerry',20,'上海'],['Mickey',22,'昆明'],['Minnie',15,'廣州']]df2=pd.DataFrame(data2,columns=['Name','Age','City'])print(df2)#使用字典創(chuàng)建DataFrame并自定義行索引df3=pd.DataFrame(data1,index=['A1','A2','A3','A4'])print(df3)12(二)DataFrame的常用屬性和方法13實(shí)例7-4DataFrame的常用屬性和方法。importpandasaspddata1={'Name':['Tom','Jerry','Mickey','Minnie'],'Age':[18,20,22,15],'City':['北京','上海','昆明','廣州']}df1=pd.DataFrame(data1)print('df1的行列數(shù):',df1.shape)print('df1每列的數(shù)據(jù)類型:\n',df1.dtypes)print('df1前2行:\n',df1.head(2))print('df1后3行:\n',df1.tail(3))print('df1中的隨機(jī)2行:\n',df1.sample(2))
本節(jié)將介紹對(duì)DataFrame數(shù)據(jù)的提取、增加、刪除、修改、條件檢索等內(nèi)容,使用相同的DataFrame進(jìn)行操作,創(chuàng)建數(shù)據(jù)的代碼為:importpandasaspddata={'ID':['001','002','003','004','005','006'],'名稱':['蘋果','香皂','牛奶','香蕉','筆記本','辣條'],'價(jià)格':[4.99,10.5,3.5,6.4,8.0,2.5],'類型':['水果','日用品','食品','水果','學(xué)習(xí)用品','食品'],'庫(kù)存量':[20,50,10,8,30,15]}df=pd.DataFrame(data,index=['A','B','C','D','E','F'])147.2
DataFrame數(shù)據(jù)的基本操作157.2.1
數(shù)據(jù)的提取(一)行的提取1.使用索引提取行
格式為:DataFrame[a:b:k],a和b為行索引,k是步長(zhǎng)(整數(shù),默認(rèn)為1)。a和b既可以自動(dòng)行號(hào),指提取從a行開(kāi)始、到b行之前(不包含b行)、步長(zhǎng)為k的行,如df[0:1]指提取df的第一行;也可以是自定義行索引,指提取從a行開(kāi)始、到b行為止(包含b行)、步長(zhǎng)為k的行,如df[’A’:’A’]也能提取df的第一行。實(shí)例7-5使用索引提取DataFrame行。print('df的前2行:\n',df[0:2])print('df的基數(shù)行:\n',df[0:6:2])print('df的C行到D行:\n',df['C':'D'])162.使用loc方法loc方法是根據(jù)索引值獲取行。loc[]的語(yǔ)法格式為:DataFrame.loc[行標(biāo)簽,列標(biāo)簽]第一個(gè)參數(shù)指定行標(biāo)簽名,第二個(gè)參數(shù)指定列標(biāo)簽名,兩個(gè)參數(shù)都可以是一個(gè)標(biāo)簽、?一個(gè)標(biāo)簽列表或者?一個(gè)范圍。如果要提取的是不連續(xù)的多行,應(yīng)將行標(biāo)簽名放入列表并傳到第一個(gè)參數(shù)中。實(shí)例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方法根據(jù)自動(dòng)行號(hào)訪問(wèn)行。語(yǔ)法格式為:
DataFrame.iloc[行號(hào),列號(hào)]第一個(gè)參數(shù)指定行號(hào),第二個(gè)參數(shù)指定列號(hào),兩個(gè)參數(shù)都可以是單個(gè)整數(shù)、?整數(shù)列表或?整數(shù)切片。
實(shí)例7-7使用iloc方法提取DataFrame行。print('行號(hào)為1的行(series形式):\n',df.iloc[1])print('行號(hào)為1的行(DataFrame形式):\n',df.iloc[[1]])print('行號(hào)3開(kāi)始的所有行:\n',df.iloc[3:])print('行號(hào)為1-3的行:\n',df.iloc[1:4])print('行號(hào)為1,2,4的行:\n',df.iloc[[1,2,4]])
18(二)列的提取
1.使用列名提取列
DataFrame是帶有標(biāo)簽的二維數(shù)組,每個(gè)標(biāo)簽相當(dāng)于每列的列名,因此,只要以字典訪問(wèn)某key的方式使用對(duì)應(yīng)的列名,就可以提取DataFrame中的單列。訪問(wèn)多列數(shù)據(jù)時(shí),需要將多個(gè)列名放入一個(gè)列表中。實(shí)例7-8使用列名提取列。print('ID列(series形式):\n',df['ID'])print('名稱和價(jià)格列:\n',df[['名稱','價(jià)格']])192.使用loc方法
loc方法是根據(jù)列名獲取列,按照l(shuí)oc[]的語(yǔ)法,第一個(gè)參數(shù)設(shè)置為:表示所有行,第二個(gè)參數(shù)設(shè)置為要提取的列標(biāo)簽,行標(biāo)簽和列標(biāo)簽之間用逗號(hào)隔開(kāi)。實(shí)例7-9使用loc提取列。print('ID列(series形式):\n',df.loc[:,'ID'])print('名稱和價(jià)格列:\n',df.loc[:,['名稱','價(jià)格']])203.使用iloc方法iloc方法根據(jù)自動(dòng)列號(hào)訪問(wèn)列,按iloc[]的語(yǔ)法,第一個(gè)參數(shù)設(shè)置為:表示所有行,第二個(gè)參數(shù)設(shè)置為列號(hào),行號(hào)和列號(hào)使用逗號(hào)分隔。實(shí)例7-10使用iloc提取列。print('列號(hào)為1的列:\n',df.iloc[:,1])print('列號(hào)為1、3的列:\n',df.iloc[:,[1,3]])print('列號(hào)3及之后的列:\n',df.iloc[:,3:])21(三)同時(shí)選擇行和列
1.使用行索引和列名
格式為:DataFrame[行索引][列名],行索引和列名的順序不限,誰(shuí)在前都可以。實(shí)例7-11使用行索引和列名選擇行列。print('第一行的名稱:\n',df[0:1]['名稱'])print('行號(hào)為2、3的名稱和價(jià)格:\n',df[2:4][['名稱','價(jià)格']])222.使用loc方法
loc方法根據(jù)行索引和列名選擇行列,同時(shí)設(shè)置loc[]的兩個(gè)參數(shù)即可選中對(duì)應(yīng)的數(shù)據(jù)。實(shí)例7-12使用loc選擇行列。print('行索引為A的名稱:',df.loc['A','名稱'])print('行索引為A的名稱和價(jià)格:\n',df.loc['A',['名稱','價(jià)格']])print('A至D行、名稱至類型列:\n',df.loc['A':'D','名稱':'類型'])print('A和D行、名稱和類型列:\n',df.loc[['A','D'],['名稱','類型']])233.使用iloc方法
同時(shí)設(shè)置iloc方法的行號(hào)和列號(hào)即可訪問(wèn)對(duì)應(yīng)的數(shù)據(jù)。實(shí)例7-13使用iloc選擇行列。print('行號(hào)為3、列號(hào)為2的數(shù)據(jù):',df.iloc[3,2])#即第四行、第三列的數(shù)據(jù)print('行號(hào)為3,列號(hào)為1-3的數(shù)據(jù):\n',df.iloc[3,1:4])print('行號(hào)為1和3,列號(hào)為1和4的數(shù)據(jù):\n',df.iloc[[1,3],[1,4]])注意:在提取數(shù)據(jù)的過(guò)程中,如果行、列連續(xù),使用冒號(hào)分隔,但沒(méi)有索引運(yùn)算符“[]”,如果行、列不連續(xù),使用逗號(hào)分隔,同時(shí)使用索引運(yùn)算符“[]”。247.2.2數(shù)據(jù)的修改
數(shù)據(jù)的修改首先要將需要修改的數(shù)據(jù)提取出來(lái),再重新賦值為新的數(shù)據(jù)。數(shù)據(jù)的修改是針對(duì)原數(shù)據(jù)進(jìn)行的,操作無(wú)法撤銷。實(shí)例7-14修改行數(shù)據(jù)。df1=df.copy()#修改最后一行數(shù)據(jù)df1[5:6]=['006','鋼筆',7,'學(xué)習(xí)用品',30]#修改行索引為E的名稱為彩筆,其他列未設(shè)置、修改結(jié)果為NaNdf1.loc['E']={'名稱':'彩筆'}df1(一)行的修改
行的修改就是先提取相關(guān)行,再直接修改行內(nèi)容。25實(shí)例7-15修改列數(shù)據(jù)。#修改行索引為A和C的價(jià)格,其他行未設(shè)置、修改結(jié)果為NaNdf1['價(jià)格']={'A':100,'C':200}#修改庫(kù)存量列數(shù)據(jù)df1['庫(kù)存量']=[10,20,25,40,65,50]df1(二)列的修改
與行的修改一致,列的修改就是提取列后修改內(nèi)容。26實(shí)例7-16修改單元格。#將第一行的“蘋果”改為“蘋果汁”df1.loc['A','名稱']='蘋果汁'#將"蘋果汁"的類型改為“飲料”df1.iloc[0,3]='飲料'df1(三)單元格的修改
單元格的修改就是先定位到單元格,再修改內(nèi)容。277.2.3數(shù)據(jù)的增加實(shí)例7-17增加行。df2=df.copy()df2.loc['G']=['007','菠蘿',18.5,'水果',20]#利用loc定位到新行G,使用列表賦值df2.loc['H']={'ID':'008','名稱':'洗衣液','價(jià)格':34.9}#使用字典為新行H賦值#定義新行new_rownew_row={'ID':'009','名稱':'保鮮袋','價(jià)格':8.9,'類型':'日用品','庫(kù)存量':30}#將new_row增加到df2中,ignore_index=True用于重置索引df2=df2._append(new_row,ignore_index=True)df2(一)行的增加
增加新行是將新的數(shù)據(jù)追加到DataFrame的末尾,實(shí)現(xiàn)的方法包括使用loc定位到新行后賦值、使用_append()方法和concat()方法等。28實(shí)例7-18增加列。df3=df.copy()#添加“進(jìn)價(jià)”列,并填充數(shù)據(jù)df3['進(jìn)價(jià)']=[3.5,6.8,2,5,4.5,1]#添加“利潤(rùn)”列,并使用計(jì)算出的價(jià)格和進(jìn)價(jià)之差填充df3['利潤(rùn)']=df3['價(jià)格']-df3['進(jìn)價(jià)']#添加“是否可售”列,所有的值均為邏輯Truedf3["是否可售"]=True#在列號(hào)為4的位置添加新列“上架日期”并填充數(shù)據(jù)df3.insert(4,'上架日期',['2024-5-1','2024-6-7','2024-7-10','2024-7-10','2024-7-15','2024-7-20'])df3(二)列的增加
要增加新列時(shí),可以直接給DataFrame分配一個(gè)新的列名,并為其提供一個(gè)與DataFrame行數(shù)相匹配的序列(如列表、Series等)作為值,也可以使用insert()方法在指定位置增加新列。297.2.4數(shù)據(jù)的刪除
刪除某行或某列數(shù)據(jù)需要使用drop()方法,其基本語(yǔ)法為:DataFrame.drop(labels,axis=0,inplace=False)其常用參數(shù)為:drop()方法默認(rèn)返回一個(gè)新的DataFrame,包含刪除后的數(shù)據(jù)。因此,如果需要保留這個(gè)新的DataFrame,可以使用inplace=True指明在原來(lái)的DataFrame中刪除,也可以將返回的DataFrame賦值給一個(gè)新的變量。30實(shí)例7-19刪除數(shù)據(jù)。df4=df.copy()df4=df4.drop('A')#刪除行標(biāo)簽為A的行,結(jié)果返回df4df4.drop(['B','D'],axis=0,inplace=True)#在df4中刪除行標(biāo)簽為B和D的行df4=df4.drop('類型',axis=1)#刪除列名為類型的列,結(jié)果返回df4df4.drop(df4.columns[2:3],axis=1)#刪除價(jià)格到庫(kù)存量的所有列,不修改df4df4317.2.5數(shù)據(jù)的篩選
數(shù)據(jù)篩選就是從大量的數(shù)據(jù)中選出有價(jià)值的數(shù)據(jù),這樣可以提高數(shù)據(jù)的可用性,有利于后期的數(shù)據(jù)分析,同時(shí),結(jié)合刪除、修改、增加操作,可以實(shí)現(xiàn)帶條件的數(shù)據(jù)更新。條件表達(dá)式用于篩選、?過(guò)濾數(shù)據(jù),常使用比較操作符和邏輯操作符來(lái)構(gòu)造。(一)按條件提取數(shù)據(jù)
實(shí)例7-20篩選數(shù)據(jù)。print('庫(kù)存量小于15的商品:\n',df[df['庫(kù)存量']<15])print('價(jià)格高于5的水果:\n',df[(df['價(jià)格']>5)&(df['類型']=='水果')])print('庫(kù)存量大于等于15的水果或食品:\n',df[((df['類型']=='水果')|(df['類型']=='食品'))&(df['庫(kù)存量']>=15)])print('除學(xué)習(xí)用品外的商品:\n',df[~(df['類型']=='學(xué)習(xí)用品')])print('蘋果、牛奶和辣條:\n',df[df['名稱'].isin(['蘋果','牛奶','辣條'])])(二)按條件操作數(shù)據(jù)
實(shí)例7-21按條件操作數(shù)據(jù)。df5=df.copy()#刪除食品df5=df5.drop(df5[df5['類型']=='食品'].index)#將df中價(jià)格在5-10之間的商品追加到df5中df5=df5._append(df[df['價(jià)格'].between(5,10)])#將庫(kù)存量小于10的商品價(jià)格調(diào)整為原來(lái)的2倍df5.loc[df5['庫(kù)存量']>10,'價(jià)格']=df5.loc[df5['庫(kù)存量']>10,'價(jià)格']*2df5347.3
數(shù)據(jù)的導(dǎo)入與導(dǎo)出7.3.1數(shù)據(jù)導(dǎo)入pandas庫(kù)將外部數(shù)據(jù)轉(zhuǎn)換為DataFrame數(shù)據(jù)格式,處理完成后可再存儲(chǔ)到外部文件中,這就是數(shù)據(jù)的導(dǎo)入和導(dǎo)出。
不同的數(shù)據(jù)源,需要使用不同的函數(shù)讀取,pandas內(nèi)置了10余種數(shù)據(jù)源讀取函數(shù)和對(duì)應(yīng)的數(shù)據(jù)寫入函數(shù)。(一)導(dǎo)入文本文件
文本文件是一種由若干字符構(gòu)成的計(jì)算機(jī)文件,是典型的順序文件。CSV是“Common—SeparatedValues”的縮寫,意思是逗號(hào)分隔值,這種文件以純文本形式存儲(chǔ)表格數(shù)據(jù),是一種簡(jiǎn)單通用的文件格式。但CSV文件的分隔符不一定是逗號(hào),所以又被稱為字符分隔文件。Pandas提供了read_table()來(lái)讀取文本文件,read_csv()來(lái)讀取CSV文件。這兩個(gè)函數(shù)的基本語(yǔ)法格式為: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)實(shí)例7-22導(dǎo)入CSV文件。importpandasaspd#使用read_table()導(dǎo)入股票數(shù)據(jù),指定分隔符和編碼方式frame1=pd.read_table('data//股票數(shù)據(jù).csv',sep=',',encoding='gbk')print(frame1.head())#使用read_csv()導(dǎo)入股票數(shù)據(jù)frame2=pd.read_csv('data//股票數(shù)據(jù).csv',encoding='gbk')print(frame2.sample(3))(二)導(dǎo)入EXCEL文件
Pandas提供了read_excel()方法來(lái)讀取Excel文件,擴(kuò)展名可以是.xls或者.xlsx,其語(yǔ)法為:pandas.read_excel(io,sheet_name=0,header=’infer’,names=None,dtype=None)實(shí)例7-23導(dǎo)入Excel文件。#使用read_excel導(dǎo)入景區(qū).xlsx第一張工作表中的數(shù)據(jù)frame4=pd.read_excel('data//景區(qū).xlsx')frame4407.3.2數(shù)據(jù)導(dǎo)出(一)導(dǎo)出CSV文件
利用pandas中的DataFrame創(chuàng)建或編輯數(shù)據(jù)后,可以把這些數(shù)據(jù)保存到CSV文件中,這需要使用DataFrame的to_csv()方法,其基本語(yǔ)法為:DataFrame.to_csv(path,sep=’,’,columns=None,header=True,index=True,mode=’w’)41實(shí)例7-24輸出CSV文件。importpandasaspdimportnumpyasnp#生成一個(gè)5行4列的DataFrame,數(shù)據(jù)由numpy產(chǎn)生的0-1之間的隨機(jī)小數(shù)填充frame5=pd.DataFrame(np.random.uniform(0,1,size=(5,4)),columns=['A','B','C','D'])print(frame5)#將生成的frame5導(dǎo)出為file1.csvframe5.to_csv('data//file1.csv')42(二)導(dǎo)出EXCEL文件
要將DataFrame中的數(shù)據(jù)存儲(chǔ)為Excel文件,需要使用DataFrame的to_excel()方法,其基本語(yǔ)法為:DataFrame.to_excel(excel_writer,sheet_name=’Sheet1’,columns=None,header=True,index=True,)該方法的常用參數(shù)與to_csv()基本一致,區(qū)別在于指定excel文件存儲(chǔ)路徑使用excel_writer,同時(shí)增加了sheet_name參數(shù),用于指定工作表名,默認(rèn)為Sheet1。43實(shí)例7-25輸出excel文件。importpandasaspdimportnumpyasnp#生成6行5列的DataFrame,數(shù)據(jù)由numpy產(chǎn)生的1-99之間的隨機(jī)整數(shù)填充frame6=pd.DataFrame(np.random.randint(1,100,size=(6,5)),columns=list('ABCDE'))print(frame6)#將生成的frame6導(dǎo)出為file2.xlsxframe6.to_excel('data/file2.xlsx')447.4
數(shù)據(jù)的預(yù)處理
在Pandas中,數(shù)據(jù)的預(yù)處理是一個(gè)廣泛的概念,涵蓋了數(shù)據(jù)清洗、整理、合并、轉(zhuǎn)換等多個(gè)方面,用于確保數(shù)據(jù)分析中數(shù)據(jù)的質(zhì)量和可用性。本節(jié)將介紹DataFrame的標(biāo)簽修改、排序、數(shù)據(jù)合并操作以及缺失值、重復(fù)值的處理,使用的數(shù)據(jù)來(lái)自“商品銷售數(shù)據(jù).xlsx”,導(dǎo)入數(shù)據(jù)的代碼如下:importpandasaspd#從商品銷售.xlsx中導(dǎo)入商品基本信息表,指定ID列為字符串類型product=pd.read_excel('data//商品銷售.xlsx',sheet_name='商品基本信息',dtype={'ID':str})#從商品銷售.xlsx中導(dǎo)入銷售信息表,指定商品ID列為字符串類型sale=pd.read_excel('data//商品銷售.xlsx',sheet_name='銷售信息',dtype={'商品ID':str})457.4.1標(biāo)簽修改(一)使用rename()方法
作為一種二維標(biāo)簽數(shù)據(jù)結(jié)構(gòu),包括行索引(index)和列標(biāo)簽(columns)在內(nèi)的DataFrame標(biāo)簽,能夠使用多種方法進(jìn)行修改。rename()方法可以用來(lái)修改行索引或列標(biāo)簽,其基本語(yǔ)法如下:DataFrame.rename(index=None,columns=None,inplace=False)index和columns參數(shù)分別用于定義新的行索引和列標(biāo)簽,inplace參數(shù)是個(gè)布爾值,表示是否在原始數(shù)據(jù)上進(jìn)行修改,默認(rèn)為False,如果要改動(dòng)原始數(shù)據(jù),應(yīng)該將inplace參數(shù)設(shè)置為True。修改列標(biāo)簽時(shí),需要將columns參數(shù)設(shè)置為一個(gè)列表或字典,其中包含新的列名。而修改行索引時(shí),需要將index參數(shù)設(shè)置為列表或字典,其中包含新的行索引。46實(shí)例7-26rename()方法修改標(biāo)簽。product1=product.copy()#將product1的行索引1改為“A”,2改為“B”product1.rename(index={1:'A',2:'B'},inplace=True)#臨時(shí)修改product的列名:將名稱改為商品名,類型改為類別product1.rename(columns={'名稱':'商品名','類型':'類別'})print(product1)47(二)直接設(shè)置屬性
通過(guò)修改columns屬性或index屬性來(lái)更改標(biāo)簽的方法更簡(jiǎn)單直接,但要注意的是,需要提供一個(gè)與原始列名或行索引長(zhǎng)度相同的列表(或類似結(jié)構(gòu)),其中包含新的列名或行索引。實(shí)例7-27通過(guò)設(shè)置屬性修改標(biāo)簽。#修改product1的index屬性,設(shè)置所有的行索引為奇數(shù)product1.index=range(1,20,2)#修改product1的columns屬性,重新設(shè)置所有的列標(biāo)簽product1.columns=['ID',"name",'price','type','quantity']product148(三)使用set_index()和reset_index()方法設(shè)置行索引
set_index()和reset_index()都可以用于設(shè)置行索引,set_index()的基本語(yǔ)法為:DataFrame.set_index(keys,drop=True,inplace=False)
參數(shù)中的keys用于設(shè)置將哪列作為新的index,將某列設(shè)置為行索引后,drop參數(shù)用于設(shè)置是否刪除該列,默認(rèn)為True,即刪除該列,而inplace參數(shù)則決定了是否對(duì)原數(shù)據(jù)進(jìn)行修改。
reset_index()方法用于還原索引列。49實(shí)例7-28set_index()和reset_index()方法的使用。#使用set_index()方法設(shè)置name和type為行索引product1.set_index(['name','type'],inplace=True)print('設(shè)置了索引的product1:\n',product1)#將product1的兩個(gè)索引列變成普通列,重置索引product1.reset_index(inplace=True)print('重置索引的product1:\n',product1)507.4.2排序(一)sort_values()方法
基本語(yǔ)法為:DataFrame.sort_values(by,axis=0,ascending=True,inplace=False)
在Pandas中,對(duì)DataFrame進(jìn)行排序是常見(jiàn)的操作,可以使用sort_values()或sort_index()方法來(lái)實(shí)現(xiàn)。sort_values()方法按值排序,而sort_index()方法按索引排序。51實(shí)例7-29sort_values()的使用。print('按價(jià)格進(jìn)行升序排列:\n',product.sort_values(by='價(jià)格'))print('先按類型升序、類型相同再按價(jià)格降序排列:\n',product.sort_values(by=['類型','價(jià)格'],ascending=[True,False]))52(二)sort_index()方法
DataFrame.sort_index(axis=0,ascending=True,inplace=False)axis參數(shù)指定排序的方向,0表示按行索引,1表示按列名排序,ascending和inplace分別用于指定是否升序排列、是否修改原數(shù)據(jù)。實(shí)例7-30sort_index()的使用。print('按行索引降序排列:\n',product.sort_index(ascending=False))print('按列名升序排列:\n',product.sort_index(axis=1))537.4.3數(shù)據(jù)合并(一)concat()方法
concat()函數(shù)能沿著一條軸將多個(gè)對(duì)象堆疊到一起,可以用來(lái)合并DataFrame或Series。其基本語(yǔ)法為:pandas.concat(objs,axis=0,join=’outer’,ignore_index=False)Pandas允許將兩個(gè)或多個(gè)DataFrame根據(jù)一些共同的屬性(如索引、列等)合并成一個(gè)新的DataFrame,它提供了多種數(shù)據(jù)合并的方法,包括join()、concat()、merge()等。54實(shí)例7-31使用concat()方法縱向合并數(shù)據(jù)。#提取product行索引為0-2的三行p1=product.loc[0:2]#提取product行索引為8-9的兩行p2=product.loc[8:9]#臨時(shí)合并p1和p2print(pd.concat([p1,p2]))#合并p1和p2,重新索引,同時(shí)將結(jié)果保存在product2中product2=pd.concat([p1,p2],ignore_index=True)print('product2:\n',product2)55實(shí)例7-32使用concat()方法橫向合并數(shù)據(jù)。#定義new_cols,保存三個(gè)商品的供應(yīng)商和上架時(shí)間new_cols=pd.DataFrame({'供應(yīng)商':['果先生','力士','大理牧場(chǎng)'],'上架日期':['2024-7-1','2024-1-3','2024-7-18']})#臨時(shí)橫向合并product2和new_cols,結(jié)果為默認(rèn)的并集print(pd.concat([product2,new_cols],axis=1))#以交集、橫向方式合并product2和new_cols,結(jié)果保存在product2中product2=pd.concat([product2,new_cols],join='inner',axis=1)print(product2)56(二)merge()方法
merge是基于數(shù)據(jù)庫(kù)風(fēng)格的連接操作,用于合并兩個(gè)或多個(gè)DataFrame。它可以根據(jù)一個(gè)或多個(gè)鍵將行連接起來(lái)。該方法合并數(shù)據(jù)有4種方式,分別是內(nèi)連接、左連接、右連接和外連接。其基本語(yǔ)法為: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.內(nèi)連接(inner)
內(nèi)連接是merge()方法的默認(rèn)連接方式,表示同時(shí)將左、右連接對(duì)象作為參考對(duì)象,根據(jù)相同的列將左表和右表連接起來(lái),結(jié)果中包含連接鍵的交集。實(shí)例7-33內(nèi)連接1。#以product為左表、sale為右表進(jìn)行內(nèi)連接,左表鍵為ID,右表鍵為商品IDpd.merge(product,sale,left_on='ID',right_on='商品ID')實(shí)例7-34內(nèi)連接2。#修改product的ID列為商品IDproduct.rename({'ID':'商品ID'},axis=1,inplace=True)#自動(dòng)按相同的列進(jìn)行內(nèi)連接,結(jié)果中去除了多余的同名連接列ps_inner=pd.merge(product,sale)ps_inner582.左連接(left)
左連接的結(jié)果中只包含左表的鍵,如果右表中不存在左鍵對(duì)應(yīng)的值,相應(yīng)的列就會(huì)填充為NaN。實(shí)例7-35左連接。ps_left=pd.merge(product,sale,how='left')ps_left3.右連接(right)
右連接的結(jié)果中只包含右表的鍵,如果左表中不存在右鍵對(duì)應(yīng)的值,相應(yīng)的列就會(huì)填充為NaN。。實(shí)例7-36右連接。ps_right=pd.merge(product,sale,how='right')ps_right594.外連接(outer)外連接的結(jié)果中包含左右表鍵的并集實(shí)例7-37外連接。ps_outer=pd.merge(product,sale,how='outer')ps_outer607.4.4缺失值處理(一)檢測(cè)缺失值isnull()或isna()方法都會(huì)返回一個(gè)與原DataFrame形狀相同的布爾型DataFrame,其中True表示缺失值(NaN),F(xiàn)alse表示非缺失值。(二)填充缺失值fillna()方法用于填充缺失值,可以指定一個(gè)常量值、DataFrame、Series、字典或用于計(jì)算填充值的函數(shù)作為填充值。如果指定了字典,則可以使用不同的值來(lái)填充不同的列。另外,如果要修改原數(shù)據(jù),則需要設(shè)置inplace參數(shù)為True。
在DataFrame中,缺失值通常使用NaN(NotaNumber)來(lái)表示。處理缺失值是數(shù)據(jù)清洗和預(yù)處理過(guò)程中的一個(gè)重要步驟。Pandas提供了多種方法來(lái)處理這些缺失值,包括刪除含有缺失值的行或列、填充缺失值以及檢測(cè)缺失值等。61(三)刪除缺失值dropna()方法用于刪除包含缺失值的行或列?;菊Z(yǔ)法為:DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)實(shí)例7-38缺失值處理(本例使用實(shí)例7-37合并生成的ps_outer,該DataFrame包含21行數(shù)據(jù),其中有兩行包含空值,行號(hào)分別為14和21)。#修改數(shù)量列的空值為100ps_outer['數(shù)量'].fillna(100,inplace=True)print(ps_outer.loc[[14]])#刪除包含空值的行,剩余20行數(shù)據(jù)ps_outer.dropna(inplace=True)print('剩余行數(shù):',len(ps_outer))637.4.5重復(fù)值處理
在數(shù)據(jù)預(yù)處理階段,處理重復(fù)值也是一個(gè)常見(jiàn)的任務(wù)。利用DataFrame的duplicated()方法判斷是否有重復(fù)數(shù)據(jù),即每一行是否與之前的行完全相同。如果有重復(fù)數(shù)據(jù),則可以利用drop_duplicates()方法刪除重復(fù)的行,該方法使用inplace參數(shù)指定是否在原數(shù)據(jù)中刪除。實(shí)例7-39檢測(cè)重復(fù)值(本例使用實(shí)例7-34合并生成的ps_inner)。print(ps_inner.duplicated())實(shí)例7-40刪除重復(fù)值。ps_inner.drop_duplicates(inplace=True)ps_inner647.5
數(shù)據(jù)分組統(tǒng)計(jì)
DataFrame的分組統(tǒng)計(jì)允許用戶根據(jù)一個(gè)或多個(gè)列的值將數(shù)據(jù)分組成子集,并對(duì)每個(gè)子集執(zhí)行統(tǒng)計(jì)運(yùn)算。這種操作在處理和分析具有層次結(jié)構(gòu)或分類數(shù)據(jù)時(shí)特別有用,比如銷售數(shù)據(jù)按地區(qū)和產(chǎn)品分類、客戶數(shù)據(jù)按年齡和性別分組等。657.5.1數(shù)據(jù)的描述性統(tǒng)計(jì)
可以使用DataFrame的描述性統(tǒng)計(jì)函數(shù)describe()快速了解數(shù)據(jù)的基本統(tǒng)計(jì)特征,如中心趨勢(shì)、分散程度等。describe()是獲取DataFrame描述性統(tǒng)計(jì)信息的最直接方法。
默認(rèn)情況下,describe()方法會(huì)計(jì)算數(shù)值型列的計(jì)數(shù)(count)、均值(mean)、標(biāo)準(zhǔn)差(std)、最小值(min)、四分位數(shù)(25%,50%,75%)和最大值(max)。對(duì)于非數(shù)值型列,則會(huì)計(jì)算唯一值(unique)、眾數(shù)(top)和頻數(shù)(freq)。實(shí)例7-41數(shù)據(jù)描述性統(tǒng)計(jì)。frame=ps_inner.copy()#描述性統(tǒng)計(jì)frame.describe()667.5.2常用聚合函數(shù)
聚合函數(shù)也稱多行函數(shù)或組合函數(shù),能夠?qū)σ唤M值進(jìn)行計(jì)算,并返回一個(gè)值。常用聚合函數(shù)有:實(shí)例7-42聚合函數(shù)的應(yīng)用。#計(jì)算售出的總數(shù)量,即數(shù)量列的總和print('售出總量:',frame['數(shù)量'].sum())#計(jì)算價(jià)格的平均值print('商品平均價(jià)格:',frame.loc[:,'價(jià)格'].mean())#計(jì)算庫(kù)存量的最大值print('最大庫(kù)存量:',frame.iloc[:,4].max())#計(jì)算記錄數(shù)print('記錄數(shù)量:',frame['商品ID'].count())#計(jì)算該DataFrame中的商品數(shù)量,即不重復(fù)的商品IDprint('商品數(shù)量:',frame['商品ID'].nunique())#查詢單次售出最多的記錄,即數(shù)量等于數(shù)量最大值的商品print('單次售出最多的記錄:\n',frame[frame['數(shù)量']==frame['數(shù)量'].max()])#查詢價(jià)格高于商品平均價(jià)格的日用品售出記錄print(frame[(frame['類型']=='日用品')&(frame['價(jià)格']>frame['價(jià)格'].mean())])687.5.3數(shù)據(jù)的分組聚合
數(shù)據(jù)分組聚合的核心方法是先進(jìn)行分組,然后對(duì)每個(gè)分組應(yīng)用聚合函數(shù),基本步驟包括:1.確定組依據(jù):首先,需要確定根據(jù)哪些列的值來(lái)分組。這些列將作為分組的“鍵”,決定了數(shù)據(jù)如何被劃分成不同的子集。2.確定聚合函數(shù):一旦數(shù)據(jù)被分組,就可以對(duì)每個(gè)分組應(yīng)用聚合函數(shù)來(lái)計(jì)算統(tǒng)計(jì)量。這些聚合函數(shù)可以是7.5.2中介紹的內(nèi)置聚合函數(shù),如sum()、mean()、min()、max()、count()等,也可以是自定義的函數(shù)。3.執(zhí)行分組統(tǒng)計(jì):使用groupby()方法選擇分組依據(jù),并通過(guò)鏈?zhǔn)讲僮髡{(diào)用聚合函數(shù)來(lái)執(zhí)行分組統(tǒng)計(jì)。69(一)groupby()分組函數(shù)
在pandas中,數(shù)據(jù)分組使用groupby()函數(shù),它能根據(jù)一個(gè)或多個(gè)鍵將DataFrame分成不同的組。分組的過(guò)程就是將原有的DataFrame按照鍵的值,劃分為若干個(gè)分組DataFrame,被分為多少個(gè)組就有多少個(gè)子DataFrame。因此,groupby()函數(shù)得到一個(gè)GroupBy對(duì)象,并沒(méi)有進(jìn)行實(shí)際運(yùn)算,只是包含了分組后的中間數(shù)據(jù)。groupby()的基本語(yǔ)法為:DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,dropna=True)實(shí)例7-43數(shù)據(jù)分組。#按類型分組,查看分組情況gs1=frame.groupby('類型')print('類型分組:\n',gs1.groups)#先按銷售日期分組,再按類型分組,查看分組情況gs2=frame.groupby(['銷售日期','類型'])print('按銷售日期和類型分組:\n',gs2.groups)雖然groupby()本身不是一個(gè)聚合函數(shù),但它與聚合函數(shù)結(jié)合使用時(shí)非常強(qiáng)大,可以在groupby()返回的分組調(diào)用聚合函數(shù)。實(shí)例7-44所有列的分組聚合。#對(duì)gs1分組結(jié)果應(yīng)用count()gs1.count()如果統(tǒng)計(jì)只針對(duì)部分列進(jìn)行,可以在命令中選擇相關(guān)列進(jìn)行操作,選擇多列統(tǒng)計(jì)時(shí),列名應(yīng)該放在列表中。實(shí)例7-45分組聚合應(yīng)用。#查詢各類商品的最低價(jià)格,即按類型分組,對(duì)價(jià)格進(jìn)行求最小值運(yùn)算print('各類商品的最低價(jià)格:\n',frame['價(jià)格'].groupby(frame['類型']).min())print('-'*50)#查詢每天的銷售額,即按銷售日期分組,對(duì)小計(jì)(新增列:價(jià)格*數(shù)量)進(jìn)行求和運(yùn)算frame['小計(jì)']=frame['價(jià)格']*frame['數(shù)量']print('每天的銷售額:\n',frame.groupby('銷售日期')[['小計(jì)']].sum())print('-'*50)#查詢每天每類商品的最高銷售額,即按銷售日期和類型分組,對(duì)小計(jì)和數(shù)量求最大值print('每天各類商品的最高銷售額:\n',frame.groupby(['銷售日期','類型'])[['小計(jì)','數(shù)量']].max())print('-'*50)#查詢最暢銷的兩種商品,即按名稱分組,求出數(shù)量的和后降序排列,再顯示前兩項(xiàng)print('最暢銷的兩種商品:\n',frame['數(shù)量'].gro
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政組織理論對(duì)經(jīng)濟(jì)發(fā)展的促進(jìn)作用試題及答案
- 速凍面食制作技術(shù)考核試卷
- 電氣機(jī)械控制系統(tǒng)故障診斷與維修考核試卷
- 道路運(yùn)輸企業(yè)物流成本分析與控制考核試卷
- 高速公路施工規(guī)劃試題及答案
- 公路工程優(yōu)化設(shè)計(jì)試題及答案
- 公路工程施工實(shí)例分析試題及答案
- 全面?zhèn)淇?025年信息系統(tǒng)監(jiān)理師試題及答案
- 屠宰生產(chǎn)安全管理制度
- 地產(chǎn)交叉檢查管理制度
- 2025《學(xué)前教育法》宣傳月培訓(xùn)含講稿
- 模具開(kāi)發(fā)保密協(xié)議書
- DB41T 2794-2024高速公路隧道和高邊坡監(jiān)測(cè)技術(shù)指南
- 2025年會(huì)展經(jīng)濟(jì)與管理考試試題及答案
- 2025年護(hù)士考試安全管理試題及答案
- 2024秋招北森題庫(kù)數(shù)學(xué)百題
- 招聘社工考試試題及答案
- 護(hù)理三基三嚴(yán)培訓(xùn)課件
- 磚和砌塊材料試題及答案
- TCCEAS001-2022建設(shè)項(xiàng)目工程總承包計(jì)價(jià)規(guī)范
- 職業(yè)教育現(xiàn)場(chǎng)工程師聯(lián)合培養(yǎng)協(xié)議書10篇
評(píng)論
0/150
提交評(píng)論