Python CategoricalDtype自定義排序實現原理解析
CategoricalDtype自定義排序
當我們的透視表生成完畢后,有很多情況下需要我們對某列或某行值進行排序。排序有很多種方法。例如sort_index及sort_values函數也可以對數據進行排序,這里就不多說了。
對于數值和字母的排序很容易,但是對于中文的排序就有點麻煩了。默認情況下是按照utf-8的編碼來進行排序的但是即使如此也很難滿足我們對漢字排序的要求。所以通過CategoricalDtye可以把數據類型轉成Category類型
然后通過指定參數列表的順序來自定義那個元素先那個元素后,完全取決于你把那個元素放在List的前面,這樣就大大方便了我們對中文排序的操作。
代碼如下:
1. 自動生成DataFrame數據
#%%import pandas as pdfrom datetime import datetimecity =['上海','北京','深圳','杭州','蘇州','青島','大連','齊齊哈爾','大理','麗江', '天津','濟南','南京','廣州','無錫','連云港','張家界']#創建自動從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自動生成數據,最終生成一個DataFramedf = 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) #將指定列轉成自定義的typedf.dtypes#%%#通過透視表統計數據tb = pd.pivot_table( df, index=['城市','倉位','航線','日期','時間'], values='出票數量', aggfunc=sum)tb
先查看數據類型:可以看出倉位的數據類型已經從Object變成了category類型了。
結果為:
分析上述數據可以看出,我們把倉位按照['頭等艙','商務艙','經濟艙']的順序進行了排序,排序結果也是按照這個順序排列的,成功的滿足了我們對中文列自定義排序的需求。
通過Pivot_table函數更加清晰的對原有數據進行了展示。也可以按照自己的需求展示其中的一部分數據。這樣對數據的清洗及展示變得更加的靈活。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。
相關文章: