Pandas是一個基于python中Numpy模塊的一個模塊
Python在數(shù)據(jù)處理和準(zhǔn)備???直做得很好,但在數(shù)據(jù)分析和建模??就差?些。pandas幫助填補了這?空?,使您能夠在Python中執(zhí)?整個數(shù)據(jù)分析?作流程,?不必切換到更特定于領(lǐng)域的語?,如R。與出?的 jupyter?具包和其他庫相結(jié)合,Python中?于進(jìn)?數(shù)據(jù)分析的環(huán)境在性能、?產(chǎn)率和協(xié)作能???都是卓越的。
pandas是 Python 的核?數(shù)據(jù)分析?持庫,提供了快速、靈活、明確的數(shù)據(jù)結(jié)構(gòu),旨在簡單、直觀地處理關(guān)系型、標(biāo)記型數(shù)據(jù)。pandas是Python進(jìn)?數(shù)據(jù)分析的必備?級?具。
pandas的主要數(shù)據(jù)結(jié)構(gòu)是 Series(?維數(shù)據(jù))與 DataFrame (?維數(shù)據(jù)),這兩種數(shù)據(jù)結(jié)構(gòu)?以處理?融、統(tǒng)計、社會科學(xué)、?程等領(lǐng)域?的?多數(shù)案例處理數(shù)據(jù)?般分為?個階段:數(shù)據(jù)整理與清洗、數(shù)據(jù)分析與建模、數(shù)據(jù)可視化與制表,Pandas 是處理數(shù)據(jù)的理想?具。
環(huán)境介紹
代碼工具:jupyternotebook
python版本:python3.8.6
系統(tǒng)版本:win10
一、Pands安裝
打開終端指令輸入pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com pandas
第?部分 數(shù)據(jù)結(jié)構(gòu)
第?節(jié) Series
?列表?成 Series時,Pandas 默認(rèn)?動?成整數(shù)索引,也可以指定索引
l = [0,1,7,9,np.NAN,None,1024,512] # ?論是numpy中的NAN還是Python中的None在pandas中都以缺失數(shù)據(jù)NaN對待 s1 = pd.Series(data = l) # pandas?動添加索引 s2 = pd.Series(data = l,index = list('abcdefhi'),dtype='float32') # 指定?索引 # 傳?字典創(chuàng)建,key?索引 s3 = pd.Series(data = {'a':99,'b':137,'c':149},name = 'Python_score') display(s1,s2,s3)
第二節(jié) Dataframe
DataFrame是由多種類型的列構(gòu)成的?維標(biāo)簽數(shù)據(jù)結(jié)構(gòu),類似于 Excel 、SQL 表,或 Series 對象構(gòu)成的字典。
import numpy as np import pandas as pd # index 作為?索引,字典中的key作為列索引,創(chuàng)建了3*3的DataFrame表格?維數(shù)組 df1 = pd.DataFrame(data = {'Python':[99,107,122],'Math':[111,137,88],'En': [68,108,43]},# key作為列索引 index = ['張三','李四','Michael']) # ?索引 df2 = pd.DataFrame(data = np.random.randint(0,151,size = (5,3)), index = ['Danial','Brandon','softpo','Ella','Cindy'],# ?索引 columns=['Python','Math','En'])# 列索引 display(df1,df2)
第三部分 數(shù)據(jù)查看
查看DataFrame的常?屬性和DataFrame的概覽和統(tǒng)計信息
import numpy as np import pandas as pd df = pd.DataFrame(data = np.random.randint(0,151,size=(150,3)), index = None, # 行索引默認(rèn) columns=['A','B','C'])#列索引 df.head(10)#顯示前十行 ??!默認(rèn)是五行??! df.tail(10)#顯示后十行 df.shape#查看行數(shù)和列數(shù) df.dtypes#查看數(shù)據(jù)類型 df.index#查看行索引 df.value# 對象值,二維數(shù)組 df.describe()#查看數(shù)據(jù)值列的匯總統(tǒng)計,計數(shù),平均值,標(biāo)準(zhǔn)差,最小值,四分位數(shù),最大值 df.info()#查看列索引,數(shù)據(jù)類型,非空計數(shù)和內(nèi)存信息
第四部分 數(shù)據(jù)的輸入輸出
第一節(jié)csv
df = DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪資情況 columns=['IT','化?','?物','教師','?兵']) #保存到相對路勁下文件命名為 df.to_csv('./salary.csv', sep = ';',#分割符 header = True,#是否保存列索引 index = True)#是否保存行索引、 #加載 pd.read_csv('./salary.csv', sep = ';',# 默認(rèn)是逗號 header = [0],#指定列索引 index_col=0) # 指定?索引 #加載 pd.read_table('./salary.csv', # 和read_csv類似,讀取限定分隔符的?本?件 sep = ';', header = [0],#指定列索引 index_col=1) # 指定?索引,IT作為?索引
第?節(jié) Excel
pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple
import numpy as np import pandas as pd df1 = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪資情況 columns=['IT','化?','?物','教師','?兵']) df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 計算機科?的考試成績 columns=['Python','Tensorflow','Keras']) # 保存到當(dāng)前路徑下,?件命名是:salary.xls df1.to_excel('./salary.xls', sheet_name = 'salary',# Excel中?作表的名字 header = True,# 是否保存列索引 index = False) # 是否保存?索引,保存?索引 pd.read_excel('./salary.xls', sheet_name=0,# 讀取哪?個Excel中?作表,默認(rèn)第?個 header = 0,# 使?第??數(shù)據(jù)作為列索引 names = list('ABCDE'),# 替換?索引 index_col=1)# 指定?索引,B作為?索引 # ?個Excel?件中保存多個?作表 with pd.ExcelWriter('./data.xlsx') as writer: df1.to_excel(writer,sheet_name='salary',index = False) df2.to_excel(writer,sheet_name='score',index = False) pd.read_excel('./data.xlsx', sheet_name='salary') # 讀取Excel中指定名字的?作表
第三節(jié) SQL
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd # SQLAlchemy是Python編程語?下的?款開源軟件。提供了SQL?具包及對象關(guān)系映射(ORM)?具 from sqlalchemy import create_engine df = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 計算機科?的考試 成績 columns=['Python','Tensorflow','Keras']) # 數(shù)據(jù)庫連接 conn = create_engine('mysql+pymysql://root:12345678@localhost/pandas? charset=UTF8MB4') # 保存到數(shù)據(jù)庫 df.to_sql('score',#數(shù)據(jù)庫中表名 conn,# 數(shù)據(jù)庫連接 if_exists='append')#如果表名存在,追加數(shù)據(jù) # 從數(shù)據(jù)庫中加載 pd.read_sql('select * from score limit 10', # sql查詢語句 conn, # 數(shù)據(jù)庫連接 index_col='Python') # 指定?索引名
---------------------------------------------!?。。。。。。?!第一次更新?。。。。。。。。。?!----------------------------------------------------------
第五部分 數(shù)據(jù)的選取
第一節(jié) 數(shù)據(jù)獲取
?。?!---先導(dǎo)入個數(shù)據(jù)---?。?! df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 計算機科?的考試成績 index = list('ABCDEFGHIJ'),# ?標(biāo)簽 columns=['Python','Tensorflow','Keras'])
df.Python# 查看所在列數(shù)據(jù) df['Python']# 查看所在列數(shù)據(jù) df[['Python','Keras']]#獲取多列數(shù)據(jù) df[1:3]#行切片操作 !!!--此處切片操作與數(shù)據(jù)的切片操作如出一轍--!!!
使用 loc[]進(jìn)行數(shù)據(jù)獲取loc通過行列標(biāo)簽進(jìn)行索引取數(shù)操作
df.loc[['A','B']]#選取行標(biāo)簽 df.loc[['A','B'],['Python','Keras']]#根據(jù)行列標(biāo)簽選取對飲數(shù)據(jù) df.loc[:,['Python','Keras']]#保留所有行 df.loc[::2,['Python','Keras']]#每隔2行取出一行數(shù)據(jù) df.loc['A',['Python','Keras']]#根據(jù)行標(biāo)簽選取出對應(yīng)數(shù)據(jù) #此處就不截圖展示了
使用iloc[]進(jìn)行數(shù)據(jù)獲取iloc通過行列整數(shù)標(biāo)簽進(jìn)行索引取數(shù)操作
df.iloc[2:4]#利用整數(shù)行切片操作與Numpy相似 !!!--此處切片操作與數(shù)據(jù)的切片操作如出一轍--!!! df.iloc[1:3,1:2]#利用整數(shù)對行和列進(jìn)行切片 df.iloc[1:3:]#行切片 df.iloc[:,0:1]#列切片
Boolean索引
cond1 = df.Python > 100 # 判斷Python分?jǐn)?shù)是否?于100,返回值是boolean類型的Series df[cond1] # 返回Python分?jǐn)?shù)?于100分的?戶所有考試科?數(shù)據(jù) cond2 = (df.Python > 50) & (df['Keras'] > 50) # &與運算 df[cond2] # 返回Python和Keras同時?于50分的?戶的所有考試科?數(shù)據(jù) df[df > 50]# 選擇DataFrame中滿?條件的值,如果滿?返回值,不然返回空數(shù)據(jù)NaN df[df.index.isin(['A','C','F'])] # isin判斷是否在數(shù)組中,返回也是boolean類型值
第六部分 數(shù)據(jù)集成
第?節(jié) concat數(shù)據(jù)串聯(lián)
#再建立兩個數(shù)據(jù)矩陣 df1 = pd.DataFrame(np.random.randint(1,151,size=10), index = list('ABCDEFGHIJ'), columns=['Science']) df2 = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]), index = list('KLMNOPQRST'), columns=['Python','Tensorflow','Keras'])
pd.concat([df,df2],axis=0)#df2串聯(lián)拼接到df1下方 pd.concat([df,df1],axis=1)#df1串聯(lián)拼接到df的左側(cè) df.append(df1) # 在df1后?追加df2
第二節(jié) 插入
insert()插入一列
注意:如果使用insert()插入一列時,那么插入的這一列的長度必須和被插入的行數(shù)長度相等
#插入一列c++ df.insert(loc=1, column='C++', value=np.random.randint(0,151,size=(10))) df.insert(loc = 1,column='Python3.8,value=2048)
第三節(jié) 數(shù)據(jù)的鏈接(join SQL風(fēng)格)
數(shù)據(jù)集的合并(merge)或連接(join)運算是通過?個或者多個鍵將數(shù)據(jù)鏈接起來的。這些運算是關(guān)系型數(shù)據(jù)庫的核?操作。pandas的merge函數(shù)是數(shù)據(jù)集進(jìn)?join運算的主要切?點。
#先建立兩組數(shù)據(jù) df1 = pd.DataFrame(data = {'sex':np.random.randint(0,2,size=6),'name':['九州','九周','Nineweek','Mrs佟','小A','小C']}) df2 = pd.DataFrame(data = {'score':np.random.randint(90,151,size=6),'name':['九州','九周','Nineweek','Mrs佟','小A','小Ming']})
pd.merge(df1,df2) #(內(nèi)連接) 在使用merge()合并中merge自動去除了空數(shù)據(jù) pd.merge(df1,df2,how='left')#左鏈接 pd.merge(df1,df2,how='right')#右鏈接
---------------------------------------------!?。。。。。。?!第二次更新?。。。。。。。。。?!----------------------------------------------------------
第七部分 數(shù)據(jù)清洗
第?節(jié) duplicated篩選重復(fù)數(shù)據(jù)
duplicated是以自上向下的順序進(jìn)行篩選如果行值相同就返回TRUE。
#創(chuàng)建一個分值數(shù)據(jù) df2 = pd.DataFrame(data={'Name':['九州','Mrs佟','Nineweek',None,np.NAN,'Mrs佟'],'Sex':[0,1,0,1,0,1],'Score':[89,100,67,90,98,100]})
df2.duplicated()#檢查重復(fù)值 以Boolean形式進(jìn)行輸出展示 df2.duplicated().sum()#打印有多少重復(fù)值 df2[df2.duplicated()]#打印重復(fù)值 df2[df2.duplicated()==False]#打印非重復(fù)值 df2.drop_duplicates()#刪除重復(fù)值(此操作并不是在數(shù)據(jù)源本身進(jìn)行刪除操作) df2.drop_duplicates(inplace=True)#刪除重復(fù)值(此操作是在數(shù)據(jù)源本身進(jìn)行刪除操作)
第二節(jié) 過濾空數(shù)據(jù)
df2.isnull()#檢查是否存在空值(可以查到NAN值和None值) df2.dropna(how = 'any') # 刪除空數(shù)據(jù)(此操作并不是在數(shù)據(jù)源本身進(jìn)行刪除操作) df2.dropna(how = 'any',inplace=True)# 刪除空數(shù)據(jù)(此操作是在數(shù)據(jù)源本身進(jìn)行刪除操作) df2.fillna(value='小A')#填充空數(shù)據(jù)(此操作并不是在數(shù)據(jù)源本身進(jìn)行刪除操作) df2.fillna(value='小A',inplace=True)#填充空數(shù)據(jù)(此操作是在數(shù)據(jù)源本身進(jìn)行刪除操作)
第三節(jié) 過濾指定行或列
del df2['Sex'] # 直接刪除某列 df2.drop(labels = ['price'],axis = 1)# 刪除指定列 df2.drop(labels = [0,1,5],axis = 0) # 刪除指定?
filter函數(shù):選取保留的數(shù)據(jù)過濾其他數(shù)據(jù)
df2.filter(items=['Name', 'Score'])#保留'Name’,'Score’兩列 df2.filter(like='S',axis = 1)# 保留列標(biāo)簽包含'S’的列(axis=1表示列,axis=0表示行) df.filter(regex='S$', axis=1)#正則方式進(jìn)行篩選
第八部分 數(shù)據(jù)轉(zhuǎn)換
第一節(jié) rename和replace的轉(zhuǎn)換標(biāo)簽個元素
#改變行列索引 df2.rename(index = {0:10,1:11},columns={'Name':'StName'})#將行索引0換為10,1換為11;列索引Name換為StName #替換元素值 df2.replace(100,102)#將所有的100替換為102 df2.replace([89,67],78)#將所有的89和67替換為78 df2.replace({'九州':'JZ',None:'九州'})#根據(jù)字典的鍵值對進(jìn)行替換 df2.replace({'Sex':1},1024)#將Sex列的1全部替換為1024
第二節(jié) apply和Transform
相同點:都能針對Dataframe的特征的計算,常與groupby()分組聚合方式下節(jié)更新方法連用
不同點:aplly參數(shù)可以是自定義函數(shù),包括簡單的求和函數(shù)以及復(fù)制的特征間的差值函數(shù)等。apply不能直接使用python的內(nèi)置函數(shù),比如sum、max、min。
Transform參數(shù)不能是自定義的特征交互函數(shù),因為transform是針對每一元素(即每一列特征操作)進(jìn)行計算。
#先建立數(shù)組 df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),index = list('ABCDEFGHIJ'),columns=['Python','En','Math'])
df['Python'].apply(lambda x:True if x >50 else False)#選取python學(xué)科中的大于50的數(shù)據(jù)
df.apply(lambda x : x.median(),axis = 0) # 列的中位數(shù)
#自定義函數(shù)算法 def avg(x): return (x.mean(),x.max(),x.min(),x.var().round(1)) df.apply(avg,axis=0)#輸出列的平均值,最大值,最小值,方差保留一位小數(shù)
# ?列執(zhí)?多項計算 df['Python'].transform([np.sqrt,np.log10]) # 對單列數(shù)據(jù)處理做開平方和對數(shù)運算
#自定義函數(shù)算法 def convert(x): if x > 140: x -= 12 else: x += 12 return x df.transform({'Python':np.sqrt,'En':np.log10,'Math':convert}).round(1)# 對多列數(shù)據(jù)處理做開不同運算
---------------------------------------------?。。。。。。。。〉谌胃拢。。。。。。。。。?!----------------------------------------------------------
第九部分 數(shù)據(jù)重塑
df = pd.DataFrame(data = np.random.randint(0,150,size = [20,3]), index = pd.MultiIndex.from_product([list('ABCDEFHIJK'),['一期','二期']]),# 多層索引 columns=['Python','En','Math'])
df.unstack(level=1)#行作列 df.stack()#列作行 df.mean(level=1)#各學(xué)科每期平均分 df.mean(level=0)#各學(xué)員平均分 df.mean()#各科平均分
第十部分 統(tǒng)計方法函數(shù)
pandas擁有多種常?的數(shù)學(xué)統(tǒng)計?法??梢詽M足大多半的數(shù)據(jù)處理,對Series和DataFrame行計算并返回Series形式的數(shù)組
#創(chuàng)建數(shù)據(jù) df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]), index = list('ABCDEFGHIJ'), columns=['Python','En','Math']) df.count() # ?NA值的數(shù)量 df.max(axis = 0) #軸0最?值,即每?列最?值 df.min() #默認(rèn)計算軸0最?值 df.median() # 中位數(shù) df.sum() # 求和 df.mean(axis = 1) #計算每??的平均值 df.quantile(q = [0.2,0.5,0.9]) # 分位數(shù) df.describe() # 查看數(shù)值型列的匯總統(tǒng)計,計數(shù)、平均值、標(biāo)準(zhǔn)差、最?值、四分位數(shù)、最?值 df['Python'].value_counts() # 統(tǒng)計元素出現(xiàn)次數(shù) df['Math'].unique() # 去重 df.cumsum() # 累加 df.cumprod() # 累乘 df.std() # 標(biāo)準(zhǔn)差 df.var() # ?差 df.cummin() # 累計最?值 df.cummax() # 累計最?值 df.diff() # 計算差分 df.pct_change() # 計算百分?變化 df.cov() # 屬性的協(xié)?差 df['Python'].cov(df['Math']) # Python和Math的協(xié)?差 df.corr() # 所有屬性相關(guān)性系數(shù) df.corrwith(df['En']) # 單?屬性相關(guān)性系數(shù)
#標(biāo)簽索引計算方式 df['Python'].argmin() # 計算Python列的最?值位置 df['Math'].argmax() # 計算Math列的最?值位置 df.idxmax() # 最?值索引標(biāo)簽 df.idxmin() # 最?值索引標(biāo)簽
第十一部分 排序
#創(chuàng)建數(shù)據(jù) df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]), index = list('ABCDEFGHIJ'), columns=['Python','En','Math']) ran = np.random.permutation(10) df = df.take(ran)#隨機排列行索引
df.sort_index(axis=0,ascending=True)#按照行索引降序排序 df.sort_index(axis=1,ascending=True)#按照列索引降序排序
df.sort_values(by='Python')#根據(jù)Python列的值降序排序 df.sort_values(by=['Python','Math'])#先按找Python排序在按照Math排序
lage = df.nlargest(3,columns='Math') # 根據(jù)屬性Math排序,返回最?3個數(shù)據(jù) samll = df.nsmallest(3,columns='Python') # 根據(jù)屬性Python排序,返回最?3個數(shù)據(jù) display(lage,samll)
第十二部分 cut與qcut的分箱處理
cut函數(shù)對數(shù)據(jù)進(jìn)行分箱處理的操作, 也就是 把一段連續(xù)的值切分成若干段,每一段的值看成一個分類。這個把連續(xù)值轉(zhuǎn)換成離散值的過程,我們叫做分箱處理cut會按照數(shù)據(jù)值由大到小的順序?qū)?shù)據(jù)分割為若干分,并且使每組范圍大致相等
qcut是按變量的數(shù)量來對變量進(jìn)行分割,并且盡量保證每個分組里變量的個數(shù)相同。
df['py_cut'] = pd.cut(df.Python,bins=4)#按照數(shù)據(jù)范圍分箱 df['en_cut'] = pd.cut(df.En,bins=4)#按照數(shù)據(jù)個數(shù)分箱 df['q_評級'] = pd.qcut(df.Python,q = 4,# 4等分 labels=['差','中','良','優(yōu)']) # 分箱后分類 df['c_評級'] = pd.cut(df.En,#分箱數(shù)據(jù) bins = [0,60,90,120,150],#分箱斷點 right = False,# 左閉右開原則 labels=['差','中','良','優(yōu)'])# 分箱后分類
---------------------------------------------!?。。。。。。?!第四次更新?。。。。。。。。。?!----------------------------------------------------------
第十三部分 分組聚合
分組Group()函數(shù),分組過程與sql的group by 函數(shù)的方式大致相同,主要處理多種類別的數(shù)據(jù),例如一個的企業(yè)的員工數(shù)據(jù)可以按照性別,年齡,薪水,部門等緯度進(jìn)行分組。
實在是找不到好的數(shù)據(jù)來進(jìn)行演示索性使用之前爬取的*車之*的一段數(shù)據(jù)進(jìn)行演示吧
df= pd.read_excel('C:/Users/admin/Desktop/home_car_allclean.xlsx')#導(dǎo)入數(shù)據(jù)
第一節(jié) 分組
# 1、分組->可迭代對象 # 1.1 先分組再獲取數(shù)據(jù) g = df.groupby(by='汽車等級')[['汽車類型','汽車排量']]#單分組 for name,data in g: print(name) print(data)
g = df.groupby(by = ['汽車類型','汽車等級'])[['汽車排量']] # 多分組 for name,data in g: print(name) print(data)
#1.2 對?列值進(jìn)?分組 df['汽車等級'].groupby(df['汽車類型']) # 單分組df['汽車名稱'].groupby([df['汽車類型'],df['汽車排量']]) # 多分組
#鍵值對分組 m ={'汽車名稱':'Name','汽車平均價格':'attribute','汽車類型':'attribute','汽車排量':'attribute','汽車等級':'attribute'} for name,data in df.groupby(m,axis = 1): print('組名',name) print('數(shù)據(jù)',data)
第二節(jié) 分組聚合
此句代碼足以慰人心,不得不感嘆Pandas的人性化
df.groupby(by='汽車類型').mean().round(1)#按照汽車類型分組再計算其余列的平均值
df.groupby(by=['汽車類型','汽車等級'])['汽車平均價格'].max()#按照汽車類型和汽車等級分組再計算汽車平均價格的最大值
第三節(jié) 分組聚合apply、transform
# 3、分組后調(diào)?apply,transform封裝單?函數(shù)計算 # 返回分組結(jié)果 df.groupby(by = ['汽車類型','汽車等級'])[['汽車平均價格','汽車排量']].apply(np.mean).round(1) def normalization(x): return (x - x.min())/(x.max() - x.min()) # 最?值最?值歸?化 # 返回全數(shù)據(jù),返回DataFrame.shape和原DataFrame.shape?樣。 df.groupby(by = ['汽車等級','汽車等級'])[['汽車平均價格','汽車排量']].transform(normalization).round(1)
第四節(jié) 分組聚合agg
# 4、agg 多中統(tǒng)計匯總操作 # 分組后調(diào)?agg應(yīng)?多種統(tǒng)計匯總 df.groupby(by=['汽車類型','汽車等級'])[['汽車平均價格','汽車排量']].agg([np.mean,np.max]).round(1) # 分組后不同屬性應(yīng)?多種不同統(tǒng)計匯總 df.groupby(by=['汽車類型','汽車等級'])[['汽車平均價格','汽車排量']].agg({'汽車平均價格':[('最高價',np.max),('最低價',np.min)], '汽車排量':[('最高排量',np.max),('最低排量',np.min)]})
聯(lián)系客服