天天看點

pandas資料分析之三:資料重塑與軸向轉化、資料分組與分組運算、離散化處理、多資料檔案合并操作

3.1 資料重塑與軸向轉換

1、階層化索引使得一個軸上擁有多個索引

2、series多層次索引:

(1)series的階層化索引:主要可以通過

s[索引第1層:索引第二次]可以進行相應的索引

(2)對于series可以通過s.unstack()函數将其轉換為DataFrame

具體舉例代碼如下:

s=pd.Series(range(1,10),index=[["a","a","a","b","b","c","c","d","d"],[1,2,3,1,2,3,1,2,3]])

#多層次索引清單的定義

print(s)

print(s.index)

print(s["a"])

print(s["a":"c"]) #進行外層索引,直接用s[]即可

print(s["a",1]) #多層索引需要用到[,]

print(s.unstack())#利用unstack可以将series轉換為dataframe,實作的效果如下所示:

pandas資料分析之三:資料重塑與軸向轉化、資料分組與分組運算、離散化處理、多資料檔案合并操作

s1=s.unstack()

3、DataFrame的多層次索引:

(1)對于多層次索引的表格的定義:

da=pd.DataFrame(np.arange(12).reshape(4,3),index=[["a","a","b","b"],[1,2,1,2]],columns=[["A","A","B"],["Z","X","C"]]) #多層次索引表格的定義

(2)對于其中的列設定為索引需要函數df.set_index([]),如果需要轉換回來則可以用函數df.reset_index()

(3)對于行索引層1和2之間進行交換可以用到函數df.swaplevel("索引名1","索引名2")

(4)對于dataframe類型的資料表格可以先利用stack()将其轉換為series,然後再利用unstack()可以轉換過來成為原始的dataframe

3.2 資料的分組與分組運算(主要是groupby技術的應用)

pandas資料分析之三:資料重塑與軸向轉化、資料分組與分組運算、離散化處理、多資料檔案合并操作

1、對于資料的分組和分組運算主要是指groupby函數的應用,具體函數的規則如下:

df[](指輸出資料的結果屬性名稱).groupby([df[屬性],df[屬性])(指分類的屬性,資料的限定定語,可以有多個).mean()(對于資料的計算方式——函數名稱)

舉例如下:

print(df["評分"].groupby([df["地區"],df["類型"]]).mean())

#上面語句的功能是輸出表格所有資料中不同地區不同類型的評分資料平均值

3.3資料的離散化

1、資料的離散化是指不太關心資料的具體數值,對資料進行一定的區間分類,使得整體的資料離散成為幾個不同的類型

2、資料的分類主要使用函數cut函數:

pd.cut(df,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)

(1)df:是指需要進行離散化的數組,series或者dataframe

(2)bins:是指劃分的依據

(3)right=True:指的是預設狀态下右邊是閉區間,是包含右邊的資料的

(4)include_lowest=False:是指預設狀态下左邊是不包含的開區間

(5)labels:是指離散化區間的定義清單,如果不輸入,則預設狀态下為None,即不會輸出離散化區間的定義名稱,隻會輸出相應所處的區間

(6)retbins=False:是指傳回df資料傳回值所對應的binst清單(很少用到)

(7)precision=3:是指精度的設定(很少用到)

舉例如下:

print(pd.cut(df["評分"],[0,4.2,4.5,4.8,5.0],labels=list("DCBA")))

#将評分列資料按照大小區間(0,4.2],(4.2,4.5],(4.5,4.8],(4.8,5.0]劃分為ABCD四個等級

df["評分等級"]=pd.cut(df["評分"],[0,4.2,4.5,4.8,5.0],labels=list("DCBA"))

print(df)

#df清單裡面增加評分等級的一列屬性資料

bins=np.percentile(df["評分人數"],[0,20,40,60,80,100])

#将評分人數進行分位數劃分(0,20%,40%,60%,80%,100%)

print(pd.cut(df["評分人數"],bins=np.percentile(df["評分人數"],[0,20,40,60,80,100]),labels=list("EDCBA")))

df["熱門程度"]=pd.cut(df["評分人數"],bins=np.percentile(df["評分人數"],[0,20,40,60,80,100]),labels=list("EDCBA"))

print(df)

print(df[(df.熱門程度=="A")&(df.評分等級=="D")]) #查詢大爛片集合

print(df[(df.評分等級=="C")&(df.熱門程度=="D")]) #高分冷門電影

3.4合并資料集

1、append

append主要是對兩組資料集進行合并,它的函數形式是:

df2.append(df1):表示在df2的後面按照行的形式進行相應的合并,主要用于批量小資料之間的合并以及在表格中增加少量的行時進行的操作函數。

具體舉例代碼如下:

d1=df[df.評分>4.8]

d2=df[df.評分人數>10000]

print(d1)

print(d2)

d3=d2.append(d1)

print(d3)

2、merge

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)

pandas資料分析之三:資料重塑與軸向轉化、資料分組與分組運算、離散化處理、多資料檔案合并操作
pandas資料分析之三:資料重塑與軸向轉化、資料分組與分組運算、離散化處理、多資料檔案合并操作

它是資料表格合并最為常用的函數形式,可以實作比較多種類不同合并要求的表格之間的合并

具體舉例代碼如下:

df1=df.loc[:5]

print(df1)

df2=df.loc[:5][["名字","類型"]]

print(df2)

df2["票房"]=["1234","12345","1234567","23412","12456","125778"]

print(df2)

print(df2.sample(frac=1)) #打亂df2的資料排列

df2.index=range(len(df2))

print(df2)

print(pd.merge(df1,df2,how="inner",on="名字")) #合并1和2表格(按照獨特的屬性,不同列屬性進行合并,相同的屬性會産生_y的兩行)

3、concat

concat主要進行多批量表格資料之間的合并,它的函數形形式如下:

concat([df1,df2...],axis=0/1) #df1,df2是指需要合并的表格資料,axis=0/1決定了表格之間合并的方式是行之間合并還是列之間合并。

具體舉例代碼如下:

df1=df[:10]

df2=df[100:110]

df3=df[200:210]

print(pd.concat([df1,df2,df3],axis=0)) #axis=0/1的作用是設定不同的表格之間合并的方式是行合并還是列合并

整體的入門運作代碼如下所示(可以直接拷貝運作,含有詳細的代碼注釋,可以輕松幫助你入門了解):

import numpy as np
import pandas as pd #導入相應的pandas子產品和numpy子產品
df=pd.read_excel("D:/Byrbt2018/Study/Python資料分析課程+練習+講解/Python資料分析課程+練習+講解/作業/作業4/作業4/酒店資料1.xlsx")#導入w我們的表格資料檔案
pd.set_option("max_columns",1000) #設定pyhton輸出資料的行和列的最大行數目(大于設定值之後才會出現省略号)
pd.set_option("max_rows",1000)
print(df)         #輸出表格檔案

#3.1資料重塑與軸向旋轉
s=pd.Series(range(1,10),index=[["a","a","a","b","b","c","c","d","d"],[1,2,3,1,2,3,1,2,3]])
#多層次索引清單的定義
print(s)
print(s.index)
print(s["a"])
print(s["a":"c"]) #進行外層索引,直接用s[]即可
print(s["a",1])  #多層索引需要用到[,]
print(s.unstack())#利用unstack可以将series轉換為dataframe
s1=s.unstack()
print(s1.fillna(0))  #将其中的空值填充為0
da=pd.DataFrame(np.arange(12).reshape(4,3),index=[["a","a","b","b"],[1,2,1,2]],columns=[["A","A","B"],["Z","X","C"]])  #定義一個4x3的表格檔案
#多層次索引表格的定義
print(da)
print(da["A"])
da.index.names=["row1","row2"]    #對于行每次索引的命名
da.columns.names=["col1","col2"]  #對于列每次索引的命名
print(da)
print(da.swaplevel("row1","row2")) #行屬性的調換函數
print(df.index)
df=df.set_index(["地區","類型"])   #将表格中的一些列直接設定為索引
print(df)
print(df.index[0])  #輸出多層索引為元組
print(df.loc["東區"]["評分人數"])   #輸出索引為東區的所有評分人數的列資料
print(df.loc["中西區","商務出行"]["評分人數"]) #多索引輸出資料
df=df.reset_index()    #取消階層化索引
print(df[:5])
#資料軸向旋轉
da=df[:5]
print(da)
print(da.T) #對于表格資料進行行和列的交換用df,T函數
print(da)
print(da.stack())  #利用stack()可以将dataframe轉換為series
print(da.stack().unstack()) #利用stack()可以将dataframe轉換為series,然後再利用unstack()可以轉換過來成為原始的dataframe

#3.2資料的分組與分組運算(主要是groupby技術的應用)
g=df.groupby(df["地區"]) #按照地區家進行彙總
print(type(g))
print(g.mean())
print(df["評分"].groupby(df["類型"]).mean())   #查詢不同類型胡平均評分
#對于多個分組變量進行分組
print(df.groupby([df["地區"],df["類型"]]).mean())
print(df.pivot_table(df,index=["地區","類型"],aggfunc=np.mean))
a=df.pivot_table(df,index=["地區","類型"],aggfunc=np.mean)
b=df.groupby([df["地區"],df["類型"]]).mean()
#以上兩個函數df.pivot_table和groupby的操作作用a和b一樣的
print(df["評分"].groupby([df["地區"],df["類型"]]).mean())
print(df["評分"].groupby([df["地區"],df["類型"]]).mean().unstack())
print(df["評分"].groupby([df["地區"],df["類型"]]).mean().unstack().fillna(0))

#3.3.資料離散化處理
print(df["評分"])
print(pd.cut(df["評分"],[0,4.2,4.5,4.8,5.0],labels=list("DCBA")))
df["評分等級"]=pd.cut(df["評分"],[0,4.2,4.5,4.8,5.0],labels=list("DCBA"))
print(df)
print(pd.cut(df["評分人數"],bins=np.percentile(df["評分人數"],[0,20,40,60,80,100]),labels=list("EDCBA")))
df["熱門程度"]=pd.cut(df["評分人數"],bins=np.percentile(df["評分人數"],[0,20,40,60,80,100]),labels=list("EDCBA"))
print(df)
print(df[(df.熱門程度=="A")&(df.評分等級=="D")])  #查詢大爛片集合
print(df[(df.評分等級=="C")&(df.熱門程度=="D")])   #高分冷門電影print(pd.cut(df["評分"],[0,4.2,4.5,4.8,5.0],labels=list("DCBA")))
df["評分等級"]=pd.cut(df["評分"],[0,4.2,4.5,4.8,5.0],labels=list("DCBA"))
print(df)
print(pd.cut(df["評分人數"],bins=np.percentile(df["評分人數"],[0,20,40,60,80,100]),labels=list("EDCBA")))
df["熱門程度"]=pd.cut(df["評分人數"],bins=np.percentile(df["評分人數"],[0,20,40,60,80,100]),labels=list("EDCBA"))
print(df)
print(df[(df.熱門程度=="A")&(df.評分等級=="D")])  #查詢大爛片集合
print(df[(df.評分等級=="C")&(df.熱門程度=="D")])   #高分冷門電影

#3.4合并資料集
#1、append合并資料集
d1=df[df.評分>4.8]
d2=df[df.評分人數>10000]
print(d1)
print(d2)
d3=d2.append(d1)
print(d3)
#2、merge
#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)
df1=df.loc[:5]
print(df1)
df2=df.loc[:5][["名字","類型"]]
print(df2)
df2["票房"]=["1234","12345","1234567","23412","12456","125778"]
print(df2)
print(df2.sample(frac=1)) #打亂df2的資料排列
df2.index=range(len(df2))
print(df2)
print(pd.merge(df1,df2,how="inner",on="名字"))  #合并1和2表格(按照獨特的屬性,不同列屬性進行合并,相同的屬性會産生_y的兩行)
#3、concat:多個資料集的批量合并
df1=df[:10]
df2=df[100:110]
df3=df[200:210]
print(pd.concat([df1,df2,df3],axis=0)) #axis=0/1的作用是設定不同的表格之間合并的方式是行合并還是列合并

轉自:The-Chosen-One       
pandas資料分析之三:資料重塑與軸向轉化、資料分組與分組運算、離散化處理、多資料檔案合并操作