Pandas在數(shù)據(jù)分析中的應用
寫在文章的最前面,Python辦公自動化有什么用?使用Python代碼腳本取代繁復的手工操作,自動化,流程化處理數(shù)據(jù)。本文借助Python中的Pandas庫進行數(shù)據(jù)導入,關于如何學習Pandas,我們可以在其官方文檔進行學習,官網(wǎng)的地址如下。
Pandas官網(wǎng)https://www.pypandas.cn/
總結來說,使用pandas可以做數(shù)據(jù)整理與清洗、數(shù)據(jù)分析與建模、數(shù)據(jù)可視化與制表等。
靈活的分組功能:group by數(shù)據(jù)分組、聚合、轉換數(shù)據(jù);
直觀地合并功能:merge數(shù)據(jù)連接;
靈活地重塑功能:reshape數(shù)據(jù)重塑;

一、數(shù)據(jù)導入、導出
pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,usecols=None, squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrows=None,na_values=None,parse_dates=False,date_parser=None,thousands=None, comment=None, skipfooter=0, convert_float=True, **kwds)
使用read_excel命令導入數(shù)據(jù),寫入路徑即可導入數(shù)據(jù)。
#導入數(shù)據(jù)df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx")df.head()

nrows導入前4行數(shù)據(jù)。
#導入前4行數(shù)據(jù)df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",nrows=4)df

sheet_name指定導入的sheet表,在首映地點中選擇中國首映的sheet表。
#導入具體的sheet數(shù)據(jù)df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",sheet_name = "中國首映")df.head()

header指定第一行是否為列名,header=0,表示數(shù)據(jù)第一行為列名,header=None,表明數(shù)據(jù)沒有列名。
#header為0時,第一行作為列索引df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",header = 0)df.head()

index_col指定列作為行索引。
#index_col為1時,第二列作為行索引df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",index_col = 1)df.head()

usecols可以指定讀取的列名。
#選擇第二列,第六列數(shù)據(jù)df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",usecols =[1,5])df.head()

skiprows跳過多少行再讀取數(shù)據(jù)。
#跳過第二行和第四行數(shù)據(jù)df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",header=0,skiprows=[1,3])df.head()

names對選取的列重命名。
#對列命名df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",usecols =[1,5],names=["電影名稱","上映日期"])df.head()

數(shù)據(jù)類型轉化
types查看字段的數(shù)據(jù)類型。
df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx")df.dtypes

dtype轉化數(shù)據(jù)類型。
#轉化數(shù)據(jù)類型df = pd.read_excel(r"C:\Users\尚天強\Desktop\film_score.xlsx",dtype={'投票人數(shù)':'int','評分':'int'})df.dtypes

數(shù)據(jù)導出
使用to_excel,寫入導出的路徑,進行數(shù)據(jù)導出,index=False消行索引。
import pandas as pda={'銷量':[10,20],'售價':[100,200]}df=pd.DataFrame(a)df.to_excel(r'C:\Users\尚天強\Desktop\learn.xlsx',index=False) #取消行索引

加入行索引,并使用index.name對其命名。
import?pandas?as?pda={'銷量':[10,20],'售價':[100,200]}df=pd.DataFrame(a,index=['A','B'])?#加入一個行索引df.index.name='貨號'df.to_excel(r'C:\Users\尚天強\Desktop\learn.xlsx')

float_format設置浮點型數(shù)據(jù)的小數(shù)位,na_rep空值進行填充。
import pandas as pda={'銷量':[10,20.43],'售價':[100.25,None]}df=pd.DataFrame(a,index=['A','B']) #加入一個行索引df.index.name='貨號'df.to_excel(r'C:\Users\尚天強\Desktop\learn.xlsx',sheet_name='第一張表',float_format='%.2f',na_rep='空值')

導入.csv文件
我們常使用的CSV文件有CSV UTF-8(逗號分隔)和CSV(逗號分隔)這兩種。

編碼方式設置
如果導出的文件為gbk編碼方式,導入數(shù)據(jù)的時候用gbk的編碼方式。encoding指定數(shù)據(jù)讀入的編碼方式。
#?如果導出的文件為gbk編碼方式,導入數(shù)據(jù)的時候用gbk?df = pd.read_csv(r"C:\Users\尚天強\Desktop\score.csv",encoding="gbk",nrows =2)#導入前兩行df
中文路徑導入數(shù)據(jù)
當文件路徑或文件名為中文時,如果是CSV UTF-8(逗號分隔)的格式文件,需要把編碼格式更改為utf-8-sig,如果是CSV(逗號分隔)的格式文件,需要把編碼格式更改為gbk。
當文件路徑或文件名為中文時,如果是CSV?UTF-8(逗號分隔)的格式文件,需要把編碼格式更改為utf-8-sig
如果是CSV(逗號分隔)的格式文件,需要把編碼格式更改為gbk 。
df?=?pd.read_csv(r'C:\Users\尚天強\Desktop\cars_scoreCSV.csv',engine="python",encoding="gbk")df.head()
df?=?pd.read_csv(r'C:\Users\尚天強\Desktop\cars_scoreUTF-8.csv',engine="python",encoding="utf-8-sig")?df.head()

二、數(shù)據(jù)字段、數(shù)據(jù)值篩選
一張表會包含很多字段,造成數(shù)據(jù)冗余,在做數(shù)據(jù)分析時,我們僅需要提取數(shù)據(jù)分析所需要的字段,這里就需要用到數(shù)據(jù)選取的知識點。本文構建數(shù)據(jù)表做數(shù)據(jù)索引,然后對數(shù)據(jù)內(nèi)容進行調整,包含修改數(shù)據(jù)類型、去除空格、數(shù)據(jù)替換、截取字符等,最后做數(shù)據(jù)規(guī)整。
構建數(shù)據(jù)表
首先導入常用的庫,設置一些數(shù)據(jù)字段,構建一張數(shù)據(jù)表。
import pandas as pdimport numpy as npimport datetimedf = pd.DataFrame({'用戶ID':[1001,1002,1003,1004,1005,1006],??????????????????'日期':pd.date_range(datetime.datetime(2021,3,23),periods=6),'城市':['北京', '上海', '廣州', '上海', '杭州', '北京'],'年齡':[23,44,54,32,34,32],'性別':['F','M','M','F','F','F'],'成交量':[3200,1356,2133,6733,2980,3452]},columns =['用戶ID','日期','城市','年齡','性別','成交量'])df

數(shù)據(jù)索引
將數(shù)據(jù)索引進行修改,賦值一個列表。
#修改索引,直接賦值給Index即可df.index=list('abcdef')df

數(shù)據(jù)索引索引某行
有三種方法,一種是loc按照名字索引,另一種是iloc按照下標索引,Ix是loc和iloc的混合,既能按索引標簽提取,也能按位置進行數(shù)據(jù)提取。
#索引兩列df.loc[:,['城市','成交量']]

#索引前兩行,兩列df.loc[['a','b'],['城市','成交量']]

#獲取第一列、第二列數(shù)據(jù)df.iloc[:,0:2]

#獲取第二行、第三行,第一、二、三列的數(shù)據(jù)df.iloc[[1, 2],[0, 1, 2]]

#?僅取出第1行的數(shù)據(jù)df.iloc[0]

#索引全部行數(shù)據(jù)df.iloc[:,[0, 1, 2]]

#使用ix按索引標簽和位置混合提取數(shù)據(jù)df.ix[:'2021-03-26',:3]

條件篩選
#篩選性別為F的數(shù)據(jù)df[df['性別']=='F']

df[(df['城市']=='北京') & (df['年齡']>30)]
#布爾索引加普通索引選擇指定的行和列df[df['年齡']>30][['用戶ID','城市','成交量']]

#切片索引加普通索引選擇指定的行和列df.iloc[0:3][['用戶ID','城市','成交量']]

數(shù)值排序
df.sort_values(['成交量'],ascending=False)

數(shù)據(jù)分類
df['達成情況']=np.where(df['成交量']>3000,'達成量高','達成量低')df

三、數(shù)據(jù)預處理
數(shù)據(jù)分析時,首先應對數(shù)據(jù)進行清洗,這里將數(shù)據(jù)清洗分為重復值處理、缺失值處理、異常值處理三個部分,重復值處理可刪除重復的字段,缺失值處理可以用線性插值、填充為0或用均值填充等,異常值處理用描述性分析、散點圖、箱形圖、直方圖查找異常并處理。本文使用超市商品交易數(shù)據(jù),詳細介紹重復值處理、缺失值處理、異常值處理的方法,并實際運用數(shù)據(jù)進行演示,代碼操作如下所示。
#導入數(shù)據(jù)import?pandas?as?pddf=pd.read_csv(r"C:\Users\尚天強\Desktop\超市商品交易.csv",engine="python",encoding="utf-8-sig")df.head()

重復值處理
首先對重復值計數(shù)。
df.duplicated().value_counts()
用drop_duplicates的方法對某幾列下面的重復行刪除,subset:以某列作為基準列,判斷是否重復;keep: 保留哪個字段,fisrt參數(shù)保留首次出現(xiàn)的數(shù)值;inplace: 是否替換當前數(shù)據(jù),True選擇替換當前數(shù)據(jù)。
df.drop_duplicates(subset=["商品碼"],keep='first',inplace=True)df.duplicated().value_counts()

缺失值處理
通過isnull函數(shù)看一下是否有空值,結果是有空值的地方顯示為True,沒有的顯示為False。
df.head(11).isnull()
使用info查看各個字段的屬性,標記的部分為缺失的部分。
df.info()
通過isnull().any()查看每一列是否有空值,True返回缺失值。
df.isnull().any()
用df.isnull().values==True來定位哪幾行是有空值的。
df[df.isnull().values==True]
how='any'只要有一個缺失值就刪除,axis=0,刪除的是行,默認刪除的是行,inplace=True替換原始數(shù)據(jù)。
df.dropna(how='any', axis=0,inplace=True)df.info()

缺失值填充
fillna(0)用0對缺失值進行填充。
df1=df[df.isnull().values==True]df1.fillna(0)

limit用來限定填充的數(shù)量。
df1.fillna(0,limit=3)
{ }對不同的列填充不同的值,其中鍵作為列,值作為缺失值填充的值。
df1.fillna({"售價":0 ,"成交價":0 ,"進價": "#N/A"})
method方法使用ffill,表示用前一個值作為填充的值。
df1.fillna(method="ffill")
median方法使用中位數(shù)的值進行填充。
df1.fillna(df1.median())
interpolate表示線性插值。
df[df.isnull().values==True].interpolate() #線性插值
四、數(shù)據(jù)可視化
對于一些異常值的處理,可以使用散點圖和箱線圖進行數(shù)據(jù)標記,describe( )對統(tǒng)計字段進行描述性分析,從平均值、標準差,看數(shù)據(jù)的波動情況,最大值查看數(shù)據(jù)的極值。
df[['售價','進價']].describe()
散點圖
做出散點圖,查看數(shù)據(jù)中異常的點,圖中標記的點就是異常的點。
from matplotlib import pyplot as pltplt.rcParams["font.sans-serif"]='SimHei' #解決中文亂碼問題plt.scatter(df["售價"], df["進價"])plt.title("散點圖",loc = "center")plt.show()

箱線圖
做出箱線圖,反映原始數(shù)據(jù)分布的特征。
plt.subplot(1,2,1)plt.boxplot(df["數(shù)量"],labels = ["數(shù)量"])plt.subplot(1,2,2)plt.boxplot(df["售價金額"],labels?=?["售價金額"])plt.show()

折線圖
做售價金額的折線圖,售價金額呈波動趨勢。
plt.plot(df["售價金額"])
用箱形圖的辦法,超過了上四分位1.5倍四分位距或下四分位1.5倍距離都算異常值,用中位數(shù)填充。
import?numpy?as?npa = df["售價金額"].quantile(0.75)b = df["售價金額"].quantile(0.25)c?=?df["售價金額"]c[(c>=(a-b)*1.5+a)|(c<=b-(a-b)*1.5)]=np.nanc.fillna(c.median(),inplace=True)c.describe()

用標準差和均值,定義超過4倍就算異常值,同樣用中位數(shù)填充。
a = df["售價金額"].mean()+df["售價金額"].std()*4b = df["售價金額"].mean()-df["售價金額"].std()*4c = df["售價金額"]c[(c>=a)|(c<=b)]=np.nanc.fillna(c.median(),inplace=True)c.describe()

import seaborn as snssns.distplot(df['售價金額'])#解決負號無法正常顯示問題plt.rcParams["axes.unicode_minus"]= Falseplt.show()

對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數(shù)據(jù)分析技能,可以在全網(wǎng)搜索書名進行了解:

