Python數據處理| Pandas知識大全

寫在前面的話

  • Pandas是專門做數據處理和分析的,擁有許多各種復雜的函數。
  • Pandas功能強大,支持類似于SQL的數據處理。
  • Pandas的底層依賴于Numpy,是在Numpy的基礎上發展而來。

導入數據庫:import pandas as pd

1、Pandas基礎知識

1.1、常用數據結構

  • Series:由一組數據以及一組與之對應的數據標簽(即索引組成);可以通過pandas.Series來創建Series,每個Series可以看成是DataFrame的一個列。
  • DataFrame:Pandas基本數據結構,類似excel中的表格形式;既有行索引、列索引,相當于多個Series。

1.1.1、Series創建與屬性

函數 用法 舉例
pd.Series(data= ,index= ,dtype= ,name= ) 創建Series,其中data可以為列表、一維數組或字典;index表示索引,必須與數據等長;dtype表示數據類型;name表示對象名稱 s=pd.Series(np.array([1,2,3,4,5,6]),index=('a','b','c','d','e','f'),dtype=int,name='this is a Series')
Series1.append(Series2) 將Series2的數據加在Series1之后 s1=pd.Series({'father':40,'mother':38})>>s2=pd.Series({'son':12,'daughter':5})>>s1.append(s2)
Series.drop(index= ,inplace= )) 刪除指定數據。inplace=False(默認)返回視圖;inplace=True改變Series。 s1=pd.Series({'father':40,'mother':38})>>s1.drop('father',inplace=True)>>s1
Series屬性 用法
Series.values 返回所有元素
Series.index 返回索引
Series.dtype 返回數據類型
Series.ndim Series都是一維的
Series.shape 返回series的形狀
Series.size 返回對象的個數

1.1.2、DataFrame創建與屬性

函數 用法 舉例
pd.DataFrame(data,index,dtype,columns) 創建Dataframe。data可以為列表,二維數組和字典;index表示行索引,columns表示列索引。 df2=pd.DataFrame({"name":['alice','tom','peter'],'age':[23,26,30]},index=(1,2,3))>>df2['name']=np.array(np.char.capitalize(list(df2['name'])))>>df2
DataFrame屬性 用法
DataFrame.values 返回所有元素
DataFrame.index 返回索引
DataFrame.dtypes 返回每個變量的數據類型
DataFrame.ndim 一般為二維
DataFrame.shape 一般為二維的形狀
DataFrame.size 返回對象的個數
DataFrame.columns 返回列標簽

1.2、數據獲取和保存

  • pandas內置了10多種數據源讀取函數,常見的是csv和excel。
  • pandas讀取出來的數據直接就是數據框格式,方便后續的數據處理和分析。
  • 讀取csv文件時,需注意編碼,常用編碼有utf-8、gbk、gbk2312等。
函數 參數 用法 舉例
os.getcwd() 無參數 獲取當前工作目錄(current working directory) import os>>os.getcwd()
os.chdir(path) path:路徑 改變當前工作目錄為path,方便直接讀取文件 import os>>os.chdir('D:')
pd.read_csv(path,encoding= ,dtype= ,nrows= ,sep= ,na_values= ,header= ,index_col=[values]) 該函數有很多參數,常用的有:①encoding:編碼,有中文字符使用utf-8、gbk、gbk2312;②dtype:規定數據類型,可使用字典對指定變量進行規定;③nrows:規定讀取的行數,默認為None;④sep:分隔符,默認為','。⑤na_values:規定指定值顯示為NaN;⑥header:規定第幾行作為表頭,默認第1行。⑦index_col:規定某幾列變量為索引。 導入csv文件 pd.read_csv('data.csv',encoding= 'gbk',dtype={'info_id':str,'ID':str},nrows=10 ,header=0)
DataFrame.head(n) n:查看行數,默認等于5 查看Dataframe的前n行 df2=pd.DataFrame({"name":['Alice','Tom','Peter'],'age':[23,26,30]},index=(1,2,3))>>df2.head(2)
DataFrame.tail(n) n:查看行數,默認等于5 查看Dataframe的最后n行 df2=pd.DataFrame({"name":['Alice','Tom','Peter'],'age':[23,26,30]},index=(1,2,3))>>df2.tail(2)
pd.read_excel(path,sheet_name= ,encoding= ,dtype= ,nrows= ,sep= ,na_values= ,header= ) 讀取excel比csv多了一個參數,即工作表名稱(sheet_name),sheet_name默認等于None,讀取全部工作表。 導入excel文件 pd.read_excel('data.csv',sheet_name=0,encoding= 'gbk',dtype={'info_id':str,'ID':str},nrows=10 ,header=0)
DataFrame.to_csv(path,index= ,encoding= ) index:是否保存索引,一般寫False。 保存為csv文件 data4.to_csv('data4.csv',index=False)
DataFrame.to_excel(path,index= ,encoding= ) index:是否保存索引,一般寫False。 保存為excel文件 data4.to_excel('data4.xlsx',index=False)

1.3、數據篩選

1.3.1、簡單篩選

函數 用法 舉例
DataFrame[x:y] 篩選x至y-1行的行數據,只能是切片查詢 data[:10]
DataFrame[values]/DataFrame.value 篩選特定的列數據,前者可以通過列表一次篩選多列,后者一次只能篩選一列 data[['info_id','ID']]
DataFrame[values][ : ] 篩選特定的列和行,可先寫行,也可先寫列,無特別規定。 data[['info_id','ID']][:50]
DataFrame.loc[A,B] 篩選特定的行和列,A表示行標簽,可以是單個標簽A1,切片A1:A2,[A1,A2];B表示列標簽,可以是單個標簽B1,切片B1:B2,[B1,B2];注意不能寫索引。 data.loc[[7,10],['info_id','ID']]
DataFrame.iloc[A,B] 篩選特定的行和列,AB均為索引。A表示行索引,可以是單個索引A1,切片A1:A2,[A1,A2];B表示列索引,可以是單個索引B1,切片B1:B2,[B1,B2]。 data.iloc[2:7,[2,3]]

1.3.2、條件篩選

函數 用法 舉例
DataFrame.loc[criteria,B] 篩選特定條件下的列,criteria表示篩選條件,如'info_id'==200;B表示列標簽,注意不能寫索引。 data.loc[data['info_id']==200,['info_id','name','ID']]
DataFrame[values][criteria] 篩選特定條件下的列,criteria可以有多個,用‘&’連接即可;values可以是列表。 data[(data['order_id']==458) & (data['amounts']>3)][['order_id','amounts','dishes_name']]
DataFrame[values].between(n1,n2,inclusive= ) 規定數字型變量的篩選區間,inclusive=True(默認)包含n1和n2,輸出布爾型 data[(data['order_id']==458) & (data['amounts'].between(0,30,inclusive=True))][['order_id','amounts','dishes_name']]
DataFrame[values].isin([str1,str2,...]) 規定字符型變量的篩選區間,篩選變量中與(str1,str2,...)字符相匹配的值。 data[data['dishes_name'].isin(['內蒙古烤肉','蒜香包'])][['order_id','amounts','dishes_name']]
DataFrame[values].str.contains(str) 規定字符型變量的篩選區間,篩選變量中含有str字符的值。 data[data['dishes_name'].str.contains('烤')][['order_id','amounts','dishes_name']]

1.3.3、增刪改查

功能 函數 用法 舉例
增加列變量 DataFrame['new_value']= 增加新變量 Data['payment']=data['price']*data['amount']
刪除列變量 DataFrame.drop([value1,value2,...],axis=1,inplace= True) 刪除value1,value2,...等變量 data.drop('dishes_id',axis=1,inplace=True)
刪除列變量 del DataFrame['value'] 刪除列變量,一次只能刪一個 del Data['payment']
調整列順序 DataFrame.insert(n,value_name,Series) 調整列順序,先刪后插 Series=data['dishes_id']>>data.drop('dishes_id',axis=1,inplace=True)>>data.insert(0,'dishes_id',series)
刪除指定行 DataFrame.drop(labels=[n1,n2,...],axis=0,inplace= True) 刪除[n1,n2,...]的行 Data.drop([2,3],axis=0)
修改指定值 DataFrame.loc[criteria,B]= 修改指定值 data.loc[data['order_id']==458,'order_id']=45800
列重命名 DataFrame.rename(columns={'value_oldname':'value_newname'},inplace=True) 為指定列重命名 data.rename(colunms={'price':'單價'},inplace=True)
行重命名 DataFrame.rename(index={'index_oldname':'index_newname'},inplace=True) 為指定行重命名 data.rename(index={0:0900},inplace=True)
查看數據 np.sum(DataFrame.isnull(),axis=0) 查看每一列的缺失值數量 --

2、Pandas高級操作

2.1、數據庫數據讀取和保存

  • 訪問數據庫:使用pymysql和sqlalchemy建立連接

導入相關的庫:

  • import pymysql
  • from sqlalchemy import create_engine
函數 參數 用法 舉例
create_engine('mysql+pymysql://user:password@IP:3306/test01') ①mysql+pymysql:dialect[+driver];②user:用戶名;③password:密碼;④IP:IP地址;⑤3306:端口號;⑥test01:數據庫名 建立mysql連接,格式固定 create_engine('mysql+pymysql://root:123456@localhost:3306/test01')
pd.read_sql(sql,con) sql:指定的sql文件,eg:sql='select * from customer_info';con:連接引擎,即create_engine函數 讀取sql文件 --
DataFrame.to_sql(name,con= ,if_exists= ,index= ) ①name:命名;②con:連接引擎,即create_engine函數;③if_exists:如果表已存在,如何執行。if_exists='fail':引發ValueError,if_exists='replace':替換原來的表,if_exists='append':追加在原來的表之后;④index: 是否將索引寫入,默認為True,一般選False。 存為sql文件 --

注:數據分析需要頻繁讀取文件數據,為了方便讀取,可以直接建立一個函數。

Image.png

2.2、數據整合

  • 數據整合又叫數據合并,將不同的數據合并在一起,集成在一張表上,有利于之后的分析。
  • 常見的合并方法有堆疊、按主鍵進行合并,堆疊又分為橫向堆疊和縱向堆疊,按主鍵合并類似于sql里面的關聯操作。
功能 函數 用法
橫向堆疊 pd.concat([d1,d2,...],axis=1,join= ) 橫向合并,join='inner',只顯示重疊部分;join='outer',顯示全部。
縱向堆疊 pd.concat([d1,d2,...],axis=0,ignore_index=True ) 縱向合并,ignore_index=True忽略之前的索引。
重置索引 DataFrame.reset_index(drop=True,inplace=True) 對數據表進行索引重置
按主鍵合并 pd.merge(left=d1,right=d2,how= ,left_on= ,right_on=,sort=True ) 左右表按指定變量合并。①how='left',則匹配左表進行合并;how='right',則匹配右表進行合并;how='outer',則全部輸出,匹配不上的顯示NaN;how='inner',則只輸出匹配數據,其余不輸出;②sort=True表示根據鍵進行排序;③right_on和left_on:合并的鍵,如果兩者相同,可直接用on參數。
按索引合并 pd.merge(left=d1,right=d2,how= ,left_index=True ,right_index=True) 左右表按索引合并,現實操作不常用。

2.3、層次化索引

  • 在導入文件上時增加index_loc[values]參數設置多層索引。
  • 利用loc函數元組進行多層索引,格式:loc[(index1,index2),values]。

3、Pandas分組聚合和透視圖

3.1、數據排序

  • 使用DataFrame.sort_values函數進行排序,并使用DataFrame.reset_index函數重置索引。
函數 用法 參數 舉例
DataFrame.sort_values([values],ascending= ,na_position= ,inplace= ) 對數據按values進行排序 ①[values]:排序的變量,可以為單個字符或列表;②ascending:是否升序,True(默認)表示升序,False表示降序;③na_position:NaN值放置位置,'first'放最前,'last'(默認)放最后。 data.sort_values('Year',ascending=True,na_position='last',inplace=True)

3.2、分組聚合

3.2.1、描述性統計

函數 用法
DataFrame.describe() 統計數值型數據的基本信息,包括計數、平均值、標準差、百分位數、最小最大值
DataFrame.describe(include=['object']) 統計字符型數據基本信息,包括計數、頻率最大字符等。
DataFrame.mean/max/min/quantile/median/count/value_counts/cumcount/unique 定向查看數據的平均值/最大值/最小值/百分位數/中位數/計數/值計數/累計計數/取值范圍。

3.2.2、分組運算

函數 參數 用法 舉例
DataFrame.groupby([values]), values:用于分組的變量,可寫成by='' 使用變量進行分組。 data[['Year','Sales','income']].groupby('Year')
DataFrame.agg(func, axis=0) func:函數、字符、列表或字典;axis默認等于0。 聚合查詢多個數據 group=data[['Year','Sales','income']].groupby('Year')>>group.agg([np.sum,np.mean]).loc[[1980,3490],('Sales',['mean','sum'])>>group.agg({Sales':np.sum,'income':[np.mean,np.median]})
DataFrame.apply(func, axis=0) func:只能為函數;axis默認等于0。 和agg函數類似,但func只能為函數,可以接lambda表達式。 DataFrame.apply(lambda x: x[2]-x[3],axis=1)
DataFrame.transform(func,axis=0) func:函數、字符、列表或字典。 對行和值進行操作,但無法進行聚合操作。 data['Sales].transform(lambda x: x*2)

<u>注:agg/apply/transform的區別:</u>

  • agg:agg方法靈活,能夠對分組對象進行相同的聚合,還可以選擇不同的聚合方法。
  • apply:apply可以進行聚合計劃,還可以按行進行計算。
  • transform:返回與數據同樣長度的行,無法進行聚合計算。

3.3、透視表和交叉表

Image [2].png
函數 參數 用法 舉例
pd.pivot_table(data,index,columns,value,aggfunc,fill_value,margins,margins_name= ) ①index:行分組鍵,可以是列表;②columns:列分組鍵,可以是列表;③value:透視圖統計的變量,只能為數值型;④aggfunc:聚合函數,默認為mean;⑤margins:是否需要總計。⑥fill_value:用來替代NaN的值。 用于對某個指定的變量進行數據透視 pd.pivot_table(data,index='Year',columns='Games',value='US_Revenue',aggfunc=[np.mean,np.sum],fill_value=0,margins=True,margins_name='總計值')
pd.crosstab(index,columns,values,aggfunc,margins,margins_name,normalize) 參數無data,normalize用于計算頻率,normalize='index',計算行頻率;normalize='columns',計算列頻率;normalize='all',計算全部的頻率。其余參數和pivot_table功能類似。 可以實現和pivot_table一樣的功能,不過一般用來查看頻率和頻數(默認)。 pd.crosstab(index=data['Platform'],columns=data['Game'],margins=True])

4、Pandas數據預處理

4.1、Pandas其他函數運用

4.1.1、數據類型轉換(日期等)

函數 參數 用法 舉例
pd.to_datetime
(arg,format,errors) ①arg:需要轉化的參數,可以是多種形式;②errors:無法轉化的表示,errors='coerce',無效值返回NaN;errors='raise'(默認),無效值引發異常報錯;errors='ignore',無效值返回原來的值。③format:參數格式,eg:%d%m%Y。 將變量轉化為日期,返回視圖。 data['time']=pd.to_datetime(data['time'],format='%Y年%m月',errors='coerce')
DataFrame.dt.time、DataFrame.dt.time 無參數 取出變量中的日期/時間。 data['date']=data['data'].dt.date
pd.datetime.today() 無參數 當前日期和時間,精確到毫秒。 --
np.timedelta64(a,b) a:表示間隔或周期;b:表示單位,可以是'm'(分),'h'(小時),'D'(天)等。 用于控制時間間隔,間隔多少年/月/天/時/分/秒/ (date_end-date_start)/np.timedelta64(1,'D')
datetime.year 無參數 查看datetime變量的年份 --
DataFrame.astype(dtype) dtype:強制轉換的數據類型或類別代碼 強制轉換數據類型,輸出視圖。 data['price']=data['price'].str[:-1].astype('float')

<u>注:Numpy中區分了str和object類型,而pandas使用本機Python字符串,因此使用Numpy字符串函數直接處理pandas的'object'會報錯,需要先將dtype轉成str。</u>

4.1.2、數據抽樣與計算

函數 參數 用法 舉例
DataFrame.sample(n,replace= ) n:抽樣的行數;replace=False即不放回抽樣。 抽樣 data.sample(n=5000,replace=False)
np.prod(ndarray,axis=1) axis:作用軸 計算給定軸上數組的乘積。 data['total_price'=data[['Quantity',Unitprice']].apply(np.prod,axis=1)(*相當于data['Quantity']* data['Unitprice'])
DataFrame.pct_change() -- 計算當前元素與先前元素之間的百分比變化,即(x1-x2)/x1 data['總價變化率']=data['total_price'].pct_change()
DataFrame.rolling(window) window:整數,設置滾動窗口的大小。 提供滾動窗口的計算 data['5天平均值']=data['total_price'].rolling(5).mean()
DataFrame.shift(periods= ,fill_value= ,axis=0) periods
:整數,向下平移的大小;fill_value:填充值,默認為NaN;axis:移動的軸,默認為0。 按給定軸平移。 data['總價變化率'=(data['total_price']-data['total_price'].shift(1))/data['total_price'],即相當于pct_change函數。

4.2、數據清洗

Image [3].png

4.2.1、重復值

  • 重復值一般采取刪除法來處理。
  • 但有些重復值不能刪除,例如訂單明細、數據或交易明細數據等。
函數 參數 用法 舉例
DataFrame.duplicated(subset= ,keep= ) ①subset:依據哪些變量判斷是否是重復值,可以是列表;②keep:保留哪些結果為“True”,='first'(默認),保留第一個重復值為True;='last',保留最后一個為True;=False,全部標記為'True'。 判斷是否有重復行,返回布爾型。 np.sum(data.duplicated(subset=['name','ID']))
DataFrame.drop_duplicates(subset= ,keep= ,inplace= ) 見DataFrame.duplicated
根據subset,忽略索引,返回刪除重復行的DataFrame --

4.2.2、缺失值

Image [4].png
函數 參數 用法 舉例
DataFrame.isnull() 無參數 判斷是否有缺失值,輸出布爾型。 data.apply(lambda x: np.sum(x.isnull())/len(x),axis=0)
DataFrame.dropna() -- 不加參數,直接刪除含有缺失值的行 data.dropna(inplace=True)
DataFrame.dropna(how= ,subset= ,inplace= ) ①how:='all',只刪除全部為NaN值的行;='any',刪除任何含有NaN值的行。②subset:數組或列表,可指定參照列 。 按條件刪除有缺失值的行。 data.dropna(how='any',subset=['gender'],inplace=True)
DataFrame.fillna(value= ,inplace= ,method= ) ①value:填充NaN值的值,可以是標量、字典和數據表。 填充NaN為指定值,如平均數(Mean)、中位數(Median)、眾數(Mode)。②method:填補方法,='ffill',用上一行數據填補;='bfill',用下一行數據填補; data.gender.fillna(value=data.gender.mode()[0]/data.fillna(value={'gender':data.gender.mode()[0]})
DataFrame.interpolate(method= ,axis= ) method:插值方法,='linear'(默認),線性插值;='polynomial',多項式插值 根據不同的方法在NaN處插入新值。 data.age.interpolate(method='polynomial',order=1)

4.2.3、異常值

Image [5].png
  • 異常值識別:①:>data.mean()+2*data.std() or <data.mean()-2*data.std() ;②>Q3+1.5(Q3-Q1) or<Q1-1.5(Q3-Q1)。
  • 最大正常值替換法:data['value'>Q3+1.5(Q3-Q1) ]=data['value'<Q3+1.5(Q3-Q1) ].max()
  • 分位數替換法:將大于99%分位數的值用99%分位數替換,小于1%分數位的值用1%分位數替換。
功能 函數 參數 舉例
箱型圖 DataFrame.Plot(kind='box') kind:畫圖種類 data.counts.plot(kind='box')
直方圖 DataFrame.Plot(kind='hist') -- --
將變量分成多個區間 pd.cut(x= ,bins= ,labels= ) ①x:用于分段的變量;②bins:分段數;labels:標簽,數量需要和分段一樣。 pd.cut(data['counts'],4,labels=range(1,5))
將變量按百分位分成多個區間 pd.qcut(x= ,q= ,labels= ) ①q:分位數數組 pd.qcut(data['counts'],[0,0.25,0.5,0.75,1],labels=range(1,5))

寫在最后的話

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。