Python数据分析(Pandas)
pandas基礎數據結構,有以下兩種:
Series,與array很像也和list相同,Series能保存不同的種數據類型,包括字符串、bool值、數字等等。
DataFrame,二維的表格型數組結構,以下內容以DataFrame為主。
Series初始化(類型轉換)s=pd.Series([1,2,3,np.nan,6.8])
索引-行標簽,查看值 a.values,a[0],切片都和numpy一樣。
索引賦值 a.index.name="索引",a.index=list("abcdef"),就不是01234了。
如果賦值給索引了,再想取切片的話,就不是0:3這樣的了,而是s["a":"c"](注意,這里是閉區間,不是左閉右開)
?
DataFrame,是一個二維結構。現在構造一個時間序列
data=pd.date_range("20190101",periods=6)(這里要寫起點,周期)
創建一個DataFrame結構,df=pd.DataFrame(np,random,randn(6,4),index=data,columns=list("ABCD"))。如果不指定index和columns,則默認從0開始的數字。隨機生成六行四列的隨機數組。
除了傳入二維數組,我們也可以使用字典傳入數據:
df2=pd.DataFrame(["A":1.2,"B":pd.Timestamp("20181001"),"C":pd.Series(1,index=list(range(4)),dtype=float),"D":np.array([3]*4,dtype=int),"E":pd.Categorical(["test","train","test","train"]),"F":"abc"])
查看頭尾數據
df.head(),默認前5行
df.tail(3),查看最后3行數據。
df.dtypes,查看所有的數據類型
下標的查看,df.index
列標的查看,df.columns
數據值的查看,df.values
?
pandas讀取數據及數據操作
讀取excel文件df=pd.read_excel(r“文件路徑”),前面加r的意思是不需要對我寫的路徑進行轉義,我寫的是什么就是什么。
讀取csv文件df=pd.csv.read_csv("文件路徑")
行操作,df.iloc[0],df.iloc[0:5]這樣的操作。df.loc[0:5],唯一不同就是不是左閉右開,索引5也在里面了。
添加一行dit={把每一列數據,相當于字典輸入。}??? s=pd.Series(dit)?? s.name=前面數據索引號加1??? df=df.append(s)
刪除一行 df=df.drop([索引號])
列操作 df.columns,查看列名。df["名字"][:5],排在前5的名字。df["xx","xx","xx"]查看多行。
增加一列,df["y"]=range(1,len(df)+1),因為range右邊不包含,所以要加一。
刪除一列,df=df.drop("y",axis=1)
通過標簽選擇數據df.loc[[index],[column]]
?
條件選擇?????? df[df["產地"]=="美國"]? df[df["產地"]=="美國"][:5]? 只看前5行
df[(df.產地==“美國”)&(df.評分>9)]
df[((df.產地==“美國”)|(df.產地==“中國大陸”))&(df.評分>9)]
缺失值處理
1、dropna?? 根據標簽中的缺失值進行過濾,刪除缺失值
參數解釋:how=“all”,刪除全為空的行或列,inplace=True覆蓋之前的數據,axis=0(行)axis=1(列)默認選擇行
2、fillna?? 對缺失值進行填充 ? df.fiilna(0)??
均值填充df["評分"].fillna(np.mean(df["評分"]),inplace=True)
3、isnull?? 返回布爾值,判斷哪些值是缺失值? df.isnull()? df["名字"].isnull()
4、notnull?? isnull的否定式
處理異常值
df[df.投票人數<0]
df[df["投票人數"]%1!=0](不是整數)df[df["投票人數"]%1==0](保留整數)
數據保存
df.to_excel("保存文件的路徑")
?
數據格式的轉換
查看數據df["XXX"].dtype
類型轉換df["XXX"]=df["XXX"].astype("int")
int整數str字符串
將年份轉換為整數
df["年代"].astype("int")
查看錯誤數據df[df.年代=="2008\u200e"]或者寫df[df["年代"]=="2008\u200e"]
查看錯誤數據的具體值df[df.年代=="2008\u200e"]["年代"].values
df.loc[index,"年代"]=2008,然后在查看df.loc[index],數據好了再轉換就好啦
將時長轉換為整數格式
刪除異常值df.drop([index],inplace=True),后面參數True是替換之前的數據。
?
排序
按照投票人數來排序
df.sort_values(by="投票人數",ascending=False),ascending這個參數是空值升序或者降序,False就是從大到小。
多個值,先按照評分排序,再按照投票人數
df.sort_values(by=["評分","投票人數"],ascending=False)
基本統計分析
(1)描述性統計對dataframe中的數值型數據進行描述性統計?df.describe()
通過描述性統計,可以發現異常值
df[df["年代"]>2019],找出之后可以刪掉,或者一句到位如下。
df.drop(df[df["年代"]>2019].index,inplace=True)
對index重新賦值df.index=range(len(df))
(2)最值
df["投票人數"].max(),df["投票人數"].min()
(3)均值和中值
df["投票人數"].mean(),df["投票人數"].median()
(4)方差var和標準差std,表示數據的離散程度
df["投票人數"].var(),df["投票人數"].std()
(5)求和
df["投票人數"].sum()
(6)相關系數corr,協方差cov
df[["投票人數","評分"]].corr(),df[["投票人數","評分"]].cov()
(7)計數
len(df),這是總數值。
產地中包含了重復值,所以要分類匯總再看。
df["產地"].unique(),會輸入不管重復幾次的值。
len(df["產地"].unique()),會輸出數值,就是有幾個產地。
替換,美國和USA是一樣的,由于歷史原因造成的,所以要數據替換,再合并。
df["產地"].replace("USA","美國",inplace=True)
df["產地"].replace(["西德","蘇聯"],["德國","俄羅斯"],inplace=True)
計算每一年電影的數量:
df["年代"].value_counts()
電影產出前5的國家或地區
df["產地"].value_counts()[:5]
保存數據
df.to_excel("XXX.xlsx")
?
數據透視
pandas里面的數據透視表函數叫:pivot_table
1、基礎形式
pd.pivot_table(df,index=["年代"]),以年代為索引,沒有參數,就是默認計算均值。
展示沒有完整展示,可以自己手動定義,查看所有結果。
再這句代碼之前設置
pd.set_option("max_columns",100),展示100列
pd.set_option("max_rows",500),展示500列
再運行,就會展示所有數據了。
2、也可以有多個索引,實際上,大多數的數據透視參數可以通過列表獲取多個值。進行聚合計算。
pd.pivot_table(df,index=["年代","產地"])
3、也可以指定需要統計匯總的數據
pd.pivot_table(df,index=["年代","產地"],values=["評分"])
4、還可以指定函數,來統計不同的統計值
pd.pivot_table(df,index=["年代","產地"],values=["投票人數"],aggfunc=np.sum)
通過將”投票人數“列和”評分“列進行對應分組,對”產地“實現數據聚合和總結。
pd.pivot_table(df,index=["產地"],values=["投票人數","評分"],aggfunc=[np.sum,np.mean])
5、非數值(NaN)難以處理,如果想移除他們,可以使用”fill_value“將其設置為0.即將空值設置為0.
pd.pivot_table(df,index=["產地"],aggfunc=[np.sum,np.mean],fill_value=0)
6、加入margins=True,可以再下方顯示一些總和數據。
pd.pivot_table(df,index=["產地"],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
7、對不同值執行不同的函數:可以向aggfunc傳遞一個字典。不過必須將標簽做的更加簡潔才行。
對各地區的投票人求和,對評分求均值。
pd.pivot_table(df,index=["產地"],values=["投票人數","評分"],aggfunc={"投票人數":np.sum,"評分":np.mean},fill_value=0)
對各個年份的投票人求和,對評分求均值。
同理,如上。pd.pivot_table(df,index=["產地"],values=["投票人數","評分"],aggfunc={"投票人數":np.sum,"評分":np.mean},fill_value=0)
透視表過濾出來,都是dataframe
求出1994年的電影平均分,和1924年的電影平均分。
table=pd.pivot_table(df,index=["年代"],values=["投票人數","評分"],aggfunc={"投票人數":np.sum,"評分":np.mean},fill_value=0)
table[table.index==1994] ,或者table[table.index==1924]
評分均分前10的年份,table.sort_values("評分",ascending=False)[:10]
?
Series層次化索引,table可以直接補充沒打完的函數、包什么的。
s=pd.Series(np.arrange(1,10),index=[["a","a","a","b","b","c","c","d","c"],[1,2,3,1,2,3,1,2,3]])
(類似excel的合并單元格)
查看具體index和數據、取a到c的所有數據、取內層第一個數據、取具體的數據a對應的2對應的值,s.index,s["a"],s["a":"c"],s[:,1],s["a",2]
可以通過unstack方法可以將Series變成一個DataFrame,容易產生缺失值
s.unstack(),轉回層次化索引的Series用:s.unstack().stack()。
DataFrame的層次化索引
生成一個四行三列的DataFrame,reshape重新約定了它的形狀,然后定義四層索引。
data=pd.DataFrame(np.arange(12).reshape(4,3),index=[["a","a","b","b"],[1,2,1,2]],co;umn=[["A","A","B"],["Z","X","C"]])
index重命名行、列、調換外層和內層索引的順序,data.index.names=["row1","row2"],data.columns.names=["col1","col2"],data.swaplevel("row1","row2")
?
把咱們電影數據處理成多層次索引
想把產地和年代設成索引,產地是外層索引,年代為內層索引
set_index可以把列變成索引。
reset_index是把索引變成列。
df=df.set_index(["產地","年代"])
每一個索引都是一個元組
df.index[0]
獲取所有美國電影,由于產地信息已經變成索引,因此要用.loc方法
df.loc["美國"]
取消多層索引
df.reset_index(),相當于全部取消了
數據旋轉
行列轉化,即為轉置。data.T
?
數據分組,分組運算
GroupBy技術:實現數據的分組和分組運算,作用類似于數據透視表
按照電影的產地進行分組
group=df.groupyby(df["產地"])
先定義一個分組變量group
type(group)
可以計算分組后的各個統計量
group.mean()
計算每年的平均評分
df["評分"].groupby(df["年代"]).mean()
注意:只會對數值變量進行分組運算(如果是字符串就不會這樣操作了,也不會顯示)
我們也可以傳入多個分組變量
df.groupby([df["產地"],df["年代"]]).mean()
獲取每個地區,每一年的電影的評分均值
df["評分"].groupby([df["產地"],df["年代"]])
means=group.mean()
?
離散化處理,即為區間化,分組,pandas提供了cut()函數,參數如下:
pd.cut(x,bins,right=True,labels=None,retbins=False,prcision=3,include_lowset=False)
把評分進行離散化處理,評分9以上定義為A,7-9定義為B,5-7為C,3-5為D,3以下為E。
pd.cut(df["評分"],[0,3,5,7,9,10],labels=["E","D","C","B","A"]),就是把這些數據劃分到一些區間里去,然后區間對應ABCDE等級里面去。
根據投票人數,來刻畫電影熱門程度,投票越多的熱門程度越高。
bins=np.percentile(df["投票人數"],[0,20,40,60,80,100])
df["熱門程度"]=pd.cut(df["投票人數"],bins,labels=["E","D","C","B","A"])
冷門高分電影
df[(df.熱門程度=="E")&(df.評分等級=="A")]
爛片
df[(df.熱門程度=="A")&(df.評分等級=="E")]
?
合并數據集
(1)append,在末尾添加一些數據的時候,多用append,相當于一個上下拼接,最好數據結構一樣。
df_usa=df[df.產地=="美國"]
df_china=df[df.產地=="中國大陸"]
df_china.append(df_usa)
(2)merge,最常用,相當于橫向拼接。
pd.merge(left,right,how="inner",on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes="_x","_y"),copy=True,indicator=False)
內連接,就是交集,如果選擇左邊,就是保證左邊不變,右邊有交集就補充,左沒有右有就不要。
on是連接鍵,必須在左和右都找到相同就用on,不一樣就分別設置。
sort:是通過連接字典順序排序,默認True,設置為False將在大多數情況下極大提高性能。
df2=df2.sample(frac=1),這樣相當于打亂數據,上下順序打亂,index還是原來的lindex。
重新設定index,df2.index=range(len(df2))。
(3)concat:將多個數據集批量合并
dff=pd.concat([df1,df2,df3],axis=0),上下拼接,axis默認為0。
dff=pd.concat([df1,df2,df3],axis=1),左右拼接。
?
統計分析:
np.random.seed(1234)
d1?=?pd.Series(2*np.random.normal(size?=?100)+3)
d2?=?np.random.f(2,4,size?=?100)
d3?=?np.random.randint(1,100,size?=?100)
?
d1.count()?#非空元素計算
d1.min()?#最小值
d1.max()?#最大值
d1.idxmin()?#最小值的位置,類似于R中的which.min函數
d1.idxmax()?#最大值的位置,類似于R中的which.max函數
d1.quantile(0.1)?#10%分位數
d1.sum()?#求和
d1.mean()?#均值
d1.median()?#中位數
d1.mode()?#眾數
d1.var()?#方差
d1.std()?#標準差
d1.mad()?#平均絕對偏差
d1.skew()?#偏度
d1.kurt()?#峰度
d1.describe()?#一次性輸出多個描述性統計指標
必須注意的是,descirbe方法只能針對序列或數據框,一維數組是沒有這個方法的
這里自定義一個函數,將這些統計描述指標全部匯總到一起:
def?stats(x):
return?pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),x.std(),x.skew(),x.kurt()],index?=?['Count','Min','Whicn_Min','Q1','Median','Q3','Mean','Max','Which_Max','Mad','Var','Std','Skew','Kurt'])
stats(d1)
?
?
查詢數據的前5行或末尾5行
student.head()
student.tail()
?
查詢指定的行
查詢指定的列
也可以通過ix索引標簽查詢指定的列
?
查詢所有女生的信息
查詢出所有12歲以上的女生信息
查詢出所有12歲以上的女生姓名、身高和體重
查詢指定的行和列
?
你只需要使用describe方法就可以實現這樣的統計了。
除以上的簡單描述性統計之外,還提供了連續變量的相關系數(corr)和協方差矩陣(cov)的求解,這個跟R語言是一致的用法。
關于相關系數的計算可以調用pearson方法或kendell方法或spearman方法,默認使用pearson方法。
如果只想關注某一個變量與其余變量的相關系數的話,可以使用corrwith,如下方只關心x1與其余變量的相關系數:
數值型變量間的協方差矩陣
?
六、缺失值處理
現實生活中的數據是非常雜亂的,其中缺失值也是非常常見的,對于缺失值的存在可能會影響到后期的數據分析或挖掘工作,那么我們該如何處理這些缺失值呢?常用的有三大類方法,即刪除法、填補法和插值法。
刪除法:當數據中的某個變量大部分值都是缺失值,可以考慮刪除改變量;當缺失值是隨機分布的,且缺失的數量并不是很多是,也可以刪除這些缺失的觀測。
替補法:對于連續型變量,如果變量的分布近似或就是正態分布的話,可以用均值替代那些缺失值;如果變量是有偏的,可以使用中位數來代替那些缺失值;對于離散型變量,我們一般用眾數去替換那些存在缺失的觀測。
插補法:插補法是基于蒙特卡洛模擬法,結合線性模型、廣義線性模型、決策樹等方法計算出來的預測值替換缺失值。
這是一組含有缺失值的序列,我們可以結合sum函數和isnull函數來檢測數據中含有多少缺失值:
直接刪除缺失值s.dorpna(),默認情況下,dropna會刪除任何含有缺失值的行。
返回結果表明,數據中只要含有缺失值NaN,該數據行就會被刪除,如果使用參數how=’all’,則表明只刪除所有行為缺失值的觀測。s.dorpna(how=’all’)
使用一個常量來填補缺失值,可以使用fillna函數實現簡單的填補工作:
1)用0填補所有缺失值 df.fillna(0)
2)采用前項填充或后向填充??df.fillna(method="ffill"),用前一個觀測值填充,df.fillna(method="bfill"),用后一個觀測值填充。
3)使用常量填充不同的列,df.fillna({"x1":1,"x2":2,"x3":3})
4)用均值或中位數填充各自的列
x1_median=df["x1"].median()
x2_mean=df["x2"].mean()
df.fillna({"x1":x1_median,"x2":x2_mean})
總結
以上是生活随笔為你收集整理的Python数据分析(Pandas)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Micropython教程之TPYBoa
- 下一篇: 戴尔Precision M6800加装西