【Python】Pivot_table透視表用法及CCategoricalDtype自定義排序
一,Pivot 及 Pivot_table函式用法
Pivot和Pivot_table函式都是對資料做透視表而使用的。其中的區別在於Pivot_table可以支援重複元素的聚合操作,而Pivot函式只能對不重複的元素進行聚合操作。
在一般的日常業務中,因為Pivot_table的功能更為強大,Pivot能做的不能做的Pivot_table都可做。所以只需要記住Pivot_table函式用法就好了。
Pivot函式的使用演示
#%% import pandas as pd df01 = pd.DataFrame( { "年份":[2019,2019,2019,2020,2020,2020],"平臺":["京東","淘寶","拼多多","京東","淘寶","拼多多"], "銷量":[100,200,300,400,500,600] } ) df01 #%% pd.pivot(df01, index = "年份", columns = "平臺", values = "銷量") #%%
聚合後結果
Pivot_table函式的使用演示
註釋:index指定什麼元素作為index顯示,columns指定列,values指定統計的值。一般values都為int後者float型別的值。aggfunc為聚合函式可以指定(mean,sum,Min,Max等統計運算等函式,如果不指定預設為mean均值)
df02 = pd.DataFrame( { "年份":[2019,2019,2019,2019,2020,2020,2020,2020], "平臺":["京東","淘寶","淘寶","拼多多","京東","淘寶","拼多多","拼多多"], "銷量":[100,200,300,400,500,600,700,800] } ) df02 #%% #pivot_table用的很多.因為可以對重複的元素進行聚合操作.而pivot函式只能對不重複的行進行運算 pd.pivot_table(df02, index="年份", columns="平臺", values="銷量", aggfunc=sum #聚合函式來對銷量進行運算.可以指定最大,最小,平均值等函式.預設為mean平均值 ) #%%
聚合結果
對比結果:這裡要強調一點的是,2020年平臺為拼多多的資料出現了2次,而且2次的值不同。在pivot函式中是無法對這種重複平臺的資料進行聚合的,但是Pivot_table則可以。
另外通過聚合函式aggfunc指定sum求和,可以把2次的值累加統計。
Pivot_table函式真實案例演示
1. 讀取表格資料
#%% df = pd.read_excel("./datas/result_datas.xlsx", ).convert_dtypes() #讀取資料並自動轉化type df.dtypes #%% df.head(3) #%%
2. 通過Pivot_table函式透視合併資料並對金額和數量做統計
因為涉及到敏感資訊,因此服務卡卡號等敏感資訊部分遮掩不顯示。但是通過部分結果也可以看出是按照號碼進行升序排序的
#按照自定義指定index,columns,values值 result = pd.pivot_table(df, index = ["姓名","服務卡卡號","明細","規格"], values = ["理賠金額(元)","數量"], aggfunc=sum ) result = result.sort_values("服務卡卡號") #按照指定values值排序 result #%% #輸出到檔案 result.to_excel("./datas/output_datas.xlsx") print("Done!!!")
二,CategoricalDtype自定義排序
當我們的透視表生成完畢後,有很多情況下需要我們對某列或某行值進行排序。排序有很多種方法。例如sort_index及sort_values函式也可以對資料進行排序,這裡就不多說了。
對於數值和字母的排序很容易,但是對於中文的排序就有點麻煩了。預設情況下是按照utf-8的編碼來進行排序的但是即使如此也很難滿足我們對漢字排序的要求。所以通過CategoricalDtye可以把資料型別轉成Category型別
然後通過指定引數列表的順序來自定義那個元素先那個元素後,完全取決於你把那個元素放在List的前面,這樣就大大方便了我們對中文排序的操作。
程式碼如下:
1. 自動生成DataFrame資料
#%% import pandas as pd from datetime import datetime city =["上海","北京","深圳","杭州","蘇州","青島","大連","齊齊哈爾","大理","麗江", "天津","濟南","南京","廣州","無錫","連雲港","張家界"] #建立自動從list中選取valuse值的get_list函式 #replace=True代表允許選出的元素重複 def get_list(items,size=20): return pd.Series(items).sample(n=size,replace=True).to_list() #通過get_list自動生成資料,最終生成一個DataFrame df = pd.DataFrame({ "城市":get_list(city), "倉位":get_list(["經濟艙","商務艙","頭等艙"]), "航線":get_list(["單程","往返"]), "日期": get_list([datetime(2020,8,1),datetime(2020,8,2), datetime(2020,8,3),datetime(2020,8,4)]), "時間": get_list(["09:00 - 12:00", "13:00 - 15:30", "06:30 - 15:00", "18:00 - 21:00", "20:00 - 23:20", "10:00 - 15:00"]), "航空公司": get_list(["東方航空","南方航空","深圳航空","山東航空","中國航空"]), "出票數量":get_list([10,15,20,25,30,35,40,45,50,55,60]), }) #%% df
結果如下:
2. 檢視資料型別
#%% df.dtypes
3. 自定義資料型別(Category)按照指定順序排序,並通過透視表展示資料
#%% #自定義type,以及自定義排序的順序 my_type = pd.CategoricalDtype( categories=["頭等艙","商務艙","經濟艙"], ordered=True ) df["倉位"] = df["倉位"].astype(my_type) #將指定列轉成自定義的type df.dtypes #%% #通過透視表統計資料 tb = pd.pivot_table( df, index=["城市","倉位","航線","日期","時間"], values="出票數量", aggfunc=sum ) tb
結果為:
分析上述資料可以看出,我們把倉位按照["頭等艙","商務艙","經濟艙"]的順序進行了排序,排序結果也是按照這個順序排列的,成功的滿足了我們對中文列自定義排序的需求。
通過Pivot_table函式更加清晰的對原有資料進行了展示。也可以按照自己的需求展示其中的一部分資料。這樣對資料的清洗及展示變得更加的靈活。