Python CategoricalDtype自定義排序實現原理解析
阿新 • • 發佈:2020-09-14
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,2),3),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
先檢視資料型別:可以看出倉位的資料型別已經從Object變成了category型別了。
結果為:
分析上述資料可以看出,我們把倉位按照["頭等艙","經濟艙"]的順序進行了排序,排序結果也是按照這個順序排列的,成功的滿足了我們對中文列自定義排序的需求。
通過Pivot_table函式更加清晰的對原有資料進行了展示。也可以按照自己的需求展示其中的一部分資料。這樣對資料的清洗及展示變得更加的靈活。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。