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)
運行結果如下: