Pandas中的交叉透視表及其使用小案例(ARPU用戶掉檔分析)

1.交叉表與透視表

pandas中的交叉表和透視表的功能與Excel中有些類似。其具體如下:

1) 交叉表(crosstab)

pandas中的crosstab函數中有幾個常見的參數,具體如下:

參數 參數說明
index 該參數可以接受array、list、series等類型。該參數指明分組依據,並形成row。
columns 跟index相同,但其值會形成columns的值。
values 聚合函數操作的值。
aggfunc 聚合函數。如果沒有指定values,則aggfunc默認統計頻率。
rownames 指定新的row值
colnames 指定新的columns值
margins 布爾類型。對所有的行和列進行彙總
dronpa 布爾類型。默認值爲True。當某一列中所有的值都是NULL時,則刪除該列。

2) 透視表(pivot_table)

pandas中的pivot_table()函數中有幾個非常重要的參數,其作用具體如下:

參數 參數說明
data 原始數據。只接收DataFrame類型的輸入。
values 指示將要用於聚合的列。
index 可以是一個列名,grouper或者是與data同樣長度的array。或者這三種組成的list。這些將作爲透視表的分組依據,並形成新的row
columns 與index相同。但是新的columns.
aggfunc 可以爲單個函數,也可以爲多個函數組成的集合類型。當爲函數集合時,每個函數的結果會水平排列(作爲列的最頂級的索引,列名即爲函數名)
fill_value 指定值的來填充缺失值
margins 布爾類型。是否對所有行和列進行彙總
dropna 布爾型。當某一列全爲NULL值時,dropna=True時刪除該列,否則保留
margins_name 字符串類型。當margins=True時而未指定margins_name時,彙總列的名稱爲‘All’。而margins_names則指定彙總列的名稱。

pivot_table的基礎用法(仍然使用交叉表示例中的數據):

從這兩個結果可以知道,index裏面的列構成結果df中的索引,columns中的列則構成df中的列, values則是aggfunc操作的的值。

pivot_table和crosstab的作用有些類似,但這兩個函數有個明顯的不同。pivot_table針對的是DataFrame中的不同col進行操作。而crosstab針對的是不同的數據之間進行的操作。

2. 案例

題目給出了500個用戶每人的7月ARPU和8月ARPU金額。主要是想分析出用戶的ARPU掉檔情況。

數據樣式:

jyputer 代碼如下:

​#第一題
import pandas as pd
data=pd.read_excel('homework_1.xlsx',hearer=0,index_col=0)
bins=list(range(0,5001,500))
data['7月ARPU']=pd.cut(data['7月ARPU'],bins,right=False)
data['8月ARPU']=pd.cut(data['8月ARPU'],bins,right=False)
cross_tab=pd.crosstab(data['7月ARPU'],data['8月ARPU'])
cross_tab=cross_tab.loc[pd.DataFrame.any(cross_tab>0,axis=1)]
cross_tab=cross_tab.div(cross_tab.sum(axis=1),axis=0)
cross_tab=cross_tab.applymap(lambda x:'' if x==0 else str(x*100)[:6]+'%')
def showH1(row):
    row=[float(row[item][:-1]) if len(row[item])>0 and row.name>item else 0 for item in row.index]
    c=[True if item>30  else False for item in row]
    return ['color:red'if v else '' for v in c]
cross_tab.style.apply(showH1,axis=1)

運行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章