你可能不知道的10個Python Pandas的技巧和特性

第二個accessor, .dt是用於類似日期時間的數據。它在技術上屬於Pandas的DatetimeIndex,如果在Series上調用,它首先轉換為DatetimeIndex :

你可能不知道的10个Python Pandas的技巧和特性

第三個accessor ,.cat,只用於分類數據,你很快將在它自己的部分中看到。

4.從組件列創建DatetimeIndex

說到類似datetime的數據,如上面的daterng,可以從多個組成列創建一個Pandas DatetimeIndex,這些組成列共同構成一個日期或日期時間:

你可能不知道的10个Python Pandas的技巧和特性

最後,你可以刪除舊的單個列並轉換為Series:

你可能不知道的10个Python Pandas的技巧和特性

傳遞DataFrame的直覺是,DataFrame類似於Python字典,其中列名是鍵,各個列(Series)是字典值。這就是為什麼pd.to_datetime(df[datecols].to_dict(orient="list"))在這種情況下也會起作用的原因。這反映了Python的datetime.datetime的構造,你可以在其中傳遞關鍵字參數,如datetime.datetime(year=2000, month=1, day=15, hour=10)。

5. 使用分類數據節省時間和空間

Pandas的一個強大特性是它的分類dtype。

即使你並不總是使用RAM中的千兆字節數據,你也可能遇到這樣的情況,即直接操作大型DataFrame似乎掛起超過幾秒鐘。

Pandas object dtype通常是轉換到類別數據的最佳候選。(object是Python str、異構數據類型或“其他”類型的容器。)字符串在內存中佔用大量空間:

你可能不知道的10个Python Pandas的技巧和特性

注意我使用sys.getsizeof來顯示序列中每個單獨的值佔用的內存。請記住,這些是Python對象,這些對象在一開始就有一些開銷。(sys.getsizeof("")將返回49字節。)

還有colors.memory_usage,它總結了內存使用情況,並依賴於底層NumPy數組的.nbytes屬性。不要太拘泥於這些細節:重要的是類型轉換導致的相對內存使用,正如您接下來將看到的。

現在,如果我們把上面的獨特顏色映射到一個佔用更少空間的整數中呢?下面是一個簡單的實現:

你可能不知道的10个Python Pandas的技巧和特性

注意:另一種方法是Pandas的pd.factorize(colors):

你可能不知道的10个Python Pandas的技巧和特性

無論哪種方式,都是將對象編碼為枚舉類型(分類變量)。

你會立刻注意到,與object dtype使用完整字符串相比,內存使用量幾乎減少了一半。

在accessor一節中,我提到了.cat(分類)accessor。上面的mapper粗略的說明Pandas的Categoricaldtype內部正在發生:

“Categorical的內存使用與類別的數量加上數據的長度成正比。相反,對象dtype是數據長度的常數倍。”(來源)

在上面的colors中,每一個唯一值(類別)都有2個值的比率:

你可能不知道的10个Python Pandas的技巧和特性

結果,從轉換到分類的內存節省是好的,但不是很大:

你可能不知道的10个Python Pandas的技巧和特性

但是,如果用大量的數據和很少的唯一值(考慮人口統計或字母測試分數的數據)來誇大上述比例,則所需的內存減少超過10倍:

你可能不知道的10个Python Pandas的技巧和特性

另一個好處是計算效率也得到了提升:對於分類Series,字符串操作是在.cat.categories屬性上執行的,而不是在Series的每個原始元素上執行的。

換言之,操作在每一個唯一類別進行,並將結果映射回值。分類數據有一個.cat accessor ,它是一扇窗用於操作屬性和方法來處理類別:

你可能不知道的10个Python Pandas的技巧和特性

事實上,您可以手動再現類似於上面的示例:

你可能不知道的10个Python Pandas的技巧和特性

為了精確地模擬早期手動輸出,你需要做的是重新排序代碼:

你可能不知道的10个Python Pandas的技巧和特性

注意,dType是NumPy的int8,一個8位有符號整數,可以取值為-127到128。(只需要一個字節來表示內存中的值。在內存使用方面,64位有符號ints將被過度使用。)我們的粗略示例默認情況下得到int64數據,而Pandas足夠聰明,能夠將分類數據向下轉換到儘可能小的數字dtype。

.cat的大多數屬性與查看和操作底層類別本身有關:

你可能不知道的10个Python Pandas的技巧和特性

不過,也有一些注意事項。分類數據一般不那麼靈活。例如,如果插入以前沒出現過的值,則需要先將此值添加到..categories容器中:

你可能不知道的10个Python Pandas的技巧和特性

如果你計劃設置值或修正數據而不是派生新的計算,則Categorical類型可能不那麼靈活。

未完,6-10條見本日推送第二篇文章。

英文原文:https://realpython.com/python-pandas-tricks/
譯者:張新英


分享到:


相關文章: