Python數據分析及應用 課件 第7章Pandas數據分析_第1頁
Python數據分析及應用 課件 第7章Pandas數據分析_第2頁
Python數據分析及應用 課件 第7章Pandas數據分析_第3頁
Python數據分析及應用 課件 第7章Pandas數據分析_第4頁
Python數據分析及應用 課件 第7章Pandas數據分析_第5頁
已閱讀5頁,還剩75頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論