天天看點

如何對Pandas DataFrame進行自定義排序

如何對Pandas DataFrame進行自定義排序

pandas dataframe有一個内置方法sort_values(),可以根據給定的變量對值進行排序。該方法本身使用起來相當簡單,但是它不适用于自定義排序,例如,

t恤尺寸:xs、s、m、l和xl

月份:一月、二月、三月、四月等

星期幾:周一、周二、周三、周四、周五、周六和周日。

在本文中,我們将了解如何對pandas dataframe進行自定義排序。

請檢視我的github repo以擷取源代碼:https://github.com/bindichen/machine-learning/blob/master/data-analysis/017-pandas-custom-sort/pandas-custom-sort.ipynb

假設我們有一個關于服裝店的資料集:

如何對Pandas DataFrame進行自定義排序

我們可以看到,每一塊布料都有一個尺寸值,資料應該按以下順序排序:

xs代表特大号

s代表小号

m代表中号

l代表大号

xl為特大号

但是,當調用sort_values('size')時,将得到以下輸出。

如何對Pandas DataFrame進行自定義排序

輸出不是我們想要的,但它在技術上是正确的。實際上,sort_values()是按數字順序對數值資料排序,對對象資料按字母順序排序。

以下是兩種常見的解決方案:

為自定義排序建立新列

使用categoricaldtype将資料強制轉換為具有有序性的類别類型

在這個解決方案中,需要一個映射資料幀來表示一個自定義排序,然後根據映射建立一個新的列,最後我們可以按新列對資料進行排序。讓我們通過一個例子來看看這是如何工作的。

首先,讓我們建立一個映射資料幀來表示自定義排序。

如何對Pandas DataFrame進行自定義排序

之後,使用sort_mapping中的映射值建立一個新的列 size_num。

最後,按新的列大小對值進行排序。

如何對Pandas DataFrame進行自定義排序

這當然是我們的工作。但它建立了一個備用列,在處理大型資料集時效率可能會降低。

我們可以使用categoricaldtype更有效地解決這個問題。

categoricaldtype是具有類别和順序的分類資料的類型[1]。它對于建立自定義排序非常有用[2]。讓我們通過一個例子來看看這是如何工作的。

首先,讓我們導入categoricaldtype。

然後,建立一個自定義類别類型cat_size_order

第一個參數設定為['xs'、's'、'm'、'l'、'xl']作為尺寸的唯一值。

第二個參數ordered=true,将此變量視為有序。

然後,調用astype(cat_size_order)将大小資料強制轉換為自定義類别類型。通過運作df['size'],我們可以看到size列已經被轉換為一個類别類型,其順序為[xs<s<m<l<xl]。

最後,我們可以調用相同的方法對值進行排序。

如何對Pandas DataFrame進行自定義排序

這樣效果更好。讓我們來看看原理是什麼。

現在size列已經被轉換為category類型,我們可以使用.cat通路器以檢視分類屬性。在幕後,它使用codes屬性來表示有序變量的大小。

讓我們建立一個新的列代碼,這樣我們可以并排比較大小和代碼值。

如何對Pandas DataFrame進行自定義排序

我們可以看到xs、s、m、l和xl的代碼分别為0、1、2、3、4和5。codes是類别實際值。通過運作df.info(),我們可以看到實際上是int8。

接下來,讓我們把事情變得更複雜一點。這裡,我們将按多個變量對資料幀進行排序。

類似地,讓我們建立兩個自定義類别類型cat_day_of_week和cat_month,并将它們傳遞給astype()。

要按多個變量排序,我們隻需要傳遞一個清單來代替sort_values()。例如,按month和day_of_week排序。

如何對Pandas DataFrame進行自定義排序

按ustomer_id,month 和day_of_week排序。

如何對Pandas DataFrame進行自定義排序

就這樣,謝謝你的閱讀。