【新手教程】Pandas大師的進階之路

2021-02-21 專知

【導讀】本文為大家帶來了算法工程師必備技能——Pandas的進階教程,主要分享了作者應用Pandas解決實際任務的過程中,所積累到的寶貴經驗。

這篇博文主要關於Pandas工具包的一些最佳實踐,其目標讀者是那些正在使用Pandas的人,即使你從未使用過Pandas,現在開始動手也不遲,不是嗎?

本文主要內容:

原文連結:

https://medium.com/unit8-machine-learning-publication/from-pandas-wan-to-pandas-master-4860cf0ce442

閱讀這篇文章時,建議讀者先瀏覽下Pandas文檔,以熟悉每個函數的大致內容。

Pandas是一個開源且受BSD許可約束的工具庫,為Python開發者提供高性能、易用的數據結構和數據分析工具。其中Pandas提供一種被稱為 DataFrame 的數據抽象結構。簡單的來說,它通過管理數據索引以達到快速訪問數據、執行分析、轉換操作、繪製圖形的目的。

撰寫這篇文章時,Pandas最新版本是v.0.24.2。

沒錯,Pandas正在努力升級到1.0版本,在此期間,每個版本升級可能都會帶來使用方式的不同。

讓我們開始吧!首先選擇的數據集是「從1985到 2016之間每個國家的自殺率」(來自Kaggle),這是一個小型數據集。簡單但足以讓你上手Pandas。

在寫代碼之前,如果你想重現實驗結果,這裡有小型的數據樣本,以防止弄錯列名和數據類型。

提示:如果你讀取的是一個大文件,在read_csv()中使用參數 chunksize=N,它會返回一個迭代器輸出數據對象。

下面是數據集的部分數據:

數據包括了從1985年到2016年間,101個國家、兩種性別、六個年代和六個不同的年齡的數據信息。我們可以使用一些簡單的方法來得到這些信息。

例如,使用unique() 和 nunique() 函數在表內獲取不重複的值(或者不重複值的數量)

使用describe()對每一個數字行輸出不同的統計數字(例如min,max,mean,count),並且,如果指定include='all'-會顯示每個列對象的不重複元素數和頂部元素(即出現最頻繁的元素數)

使用 head() 和tail() 顯示小部分數據集等。

在處理數據之前,很重要的是理解數據,並為數據集的列對象選擇正確的類型。

在Pandas內部,每種不同類型的數據,將存儲為不同的numpy數組(例如一個float64矩陣、一個int32矩陣)。

這裡有兩種方法可以大大降低您的內存消耗。

Pandas自帶了一個方法memory_usage(),用於分析DataFrame的內存消耗。在上面的代碼中,指定deep=true以確保考慮實際系統使用情況。

理解行數據類型是重要的。它可以通過以下兩個簡單的方法為您節省高達90%的內存使用量:1. 了解你的DataFrame使用的是什麼數據類型;2. 了解DataFrame中可以使用哪種數據類型,來減少內存使用(例如,如果在價格列中使用float64,則它可能會產生不必要的開銷)

除了降低自己使用的數字類型的大小之外,(int32代替int64),pandas還帶有一個categorical 類型。

如果你是一個R語言開發者,你可以把它看成是一個factor類型。

categorical 類型允許用索引替換重複的值,並將實際值存儲在其他地方。例如,針對國家類型,與其將同一個字符串「瑞士」或「波蘭」存儲多次,不如簡單地用0和1替換它們,然後存儲於一個字典中。

categorical_dict = {0: 'Switzerland', 1: 'Poland'}

回到我們的convert_df()方法上,當列類型不統一時,這個方法會自動的將列類型轉換成大多數的樣子。

通過我們「聰明」的轉換,DataFrame幾乎減少了10倍(準確是7.34倍)內存。

Pandas很強大,但需要一定的開銷。加載DataFrame時,它會創建索引並將數據存儲在numpy數組中。意思是說,一旦內存加載了DataFrame,如果用戶可以正確地管理索引,就可以非常快地訪問數據。

訪問數據的方法主要有兩種,即索引和查詢。根據情況,你可以選擇其中一個。然而,在大多數情況下,索引(和多索引)是最佳選擇。讓我們以下面的例子為例

整個過程加速了20倍!

那麼,創建這個多索引需要多少時間(如上圖)?可以看出,創建索引的時間開銷,是執行查詢的1.5倍。如果只想檢索一次數據(很少是這樣),那麼查詢是正確的方法。否則,一定要採用索引的方式,你的CPU會感謝你的。

.set_index(drop=False) //這種設置,將不允許刪除索引列。

.loc[] / .iloc[] 方法在想要只讀DataFrame時性能非常好。如果需要手工構造(例如使用循環),那麼可以考慮另一個數據結構(例如字典、列表),然後在準備好所有數據後,一次性創建DataFrame。否則,對於DataFrame中的每一個新行,pandas都會更新索引,這不是一個簡單的hashmap,會非常耗時。

通過將方法與 DataFrame 連結組合,可以形成 DataFrame 的處理鏈條。在當前版本的Pandas中,使用方法鏈的原因,是可以避免存儲中間變量,並防止以下情況:

方法連結器的工具箱,由不同的方法(例如apply、assign、loc、query、pipe、groupby、agg)組成,這些方法輸出DataFrame或序列對象(或DataFrameGroupby)。

為了找出「Generation X」所關聯的三個年齡組,這個工作我們可以通過方法鏈條來實現。第一步是對年齡組進行分組。此方法返回一個DataframeGroupBy對象,其中每個組通過唯一標籤進行聚合,在聚合過程中,方法可以接收一個lambda函數。

在最新版本(v0.25)中,Pandas引入了一種使用agg的新方法。

圖:使用sort_values和head函數展示每個國家和年份最多自殺數

圖:使用nlargest函數展示每個國家和年份最多自殺數

在上述示例中,輸出是相同的:一個包括二級多索引(國家和年份)的DataFrame,以及一個包含10個排序最大值的新列suicides_su。

nlargest(10) 比sort_values(ascending=False).head(10)還要有效。

另一個有趣的方法是unstack,它允許轉變索引級別。

「age」是索引,「succides_no」和「population」有一個二級列「sex」

下一種方法,pipe,是非常通用的方法之一。允許程序進行管道操作(如shell腳本中的操作),並使用鏈式方法完成更多操作。

管道的一個強大的用法是用來記錄不同的信息

例如,如果與列year相比,我們希望驗證列country_year是否正確。

圖:在「country_year」欄中驗證」year」的管道

這條管道的輸出是一個DataFrame,同時也將在標準輸出(console/repl)中列印出來,同理,你也可以在一個鏈中放入不同的管道操作

除了輸出到控制臺之外,pipe還可以直接在DataFrame上進行函數操作

通過深入研究代碼,我們可以看出,norm_df() 將對輸入的DataFrame和列數組使用MinMaxScaling方法進行縮放。

以下tips非常有用,但並不適用於前面的任何部分。

1、itertuples()在DataFrame的行中迭代效率更高。

2、使用merge()來替代join()。

3、在Jupyter notebook中,以「%%time」開頭的單元格,可以更加高效的完成時間操作。

4、uint8 數據類型可以支持整數的NaN值。

5、請記住,任何密集的I/O操作,(例如一個大csv文件轉儲)都可以在較低級別的方法(儘可能多地使用python核心函數)中表現得更好。

除了本文提到的方法之外,還有一些有用的方法/數據結構沒有被本文所涵蓋,同樣值得大家花時間去理解。

感謝閱讀這篇短文,也希望大家能夠更好地了解Pandns在幕後的工作方式,以及pandas工具庫目前的發展狀況。希望通過本文的介紹,令讀者對索引和查詢內容有了一個清晰的認識。最後,建議大家針對Pandas的各類函數,多多實踐,不斷提升對工具的熟練程度。

實踐會帶來改變,所以請繼續努力提高自己的技能,幫助我們建立一個更好的世界。

PS:有時純numpy實現更快(Julien Herzen)

相關焦點

  • PANDAS: 新手教程 一
    # 如果你使用的是Anacondaconda install -c conda-forge pandas# 使用pip安裝Pandaspip install pandas# 導入pandasimport pandas as pd在這個練習中,我將使用著名的鐵達尼號數據集。
  • Pandas性能優化:進階篇
    在這裡介紹一些更高級的pandas優化方法。3 進階 並行化處理並行化讀取數據在基礎篇講分塊讀取時,簡單提了一下並行化處理,這裡詳細說下代碼。第一種思路,分塊讀取,多進程處理。multiprocessing as mpimport timedef slow_func(s):    time.sleep(1)    return "done"with mp.Pool(mp.cpu_count()) as pool:    df['newcol'] = pool.map(slow_func, df['qid'])4 進階
  • 從新手到大師的進階之路
    刻意練習這個詞最近很流行,就去翻了翻原著,作者推翻了天才存在的言論,推翻了一萬小時定律,認為通過刻意練習,人人都可以從新手到大師,「天才」也是刻意練習的產物。 看看刻意練習是什麼? 通過研究大師的作品,努力從記憶中複製它,然後將複製品和原始作品做比較,發現其中的區別,再予以糾正。這個就是富蘭克林的練習方法。這個方法使富蘭克林成為美國早期歷史上最受尊敬的作家,他的著作《窮查裡智慧書》以及後來的自傳,成為美國文學的中的經典。
  • GitHub標星7700:Python從新手到大師,只要100天
    有位名叫駱昊 (jackfrued) 的資深程式設計師,為大家規劃了一條從「從新手到大師」的百天之路。從全方位熟悉語言,到Python的進階用法,再到天南地北的實戰攻略:只要沿著這條路走下去,就都會遇到的。
  • 【heronuke】名師中文講解ZBrush入門進階教學-免費下載
    點擊這裡領取我哦 ↑↑↑官方網站:www.heronuke.com作者介紹本次給大家推薦的是一套ZB零基礎到入門進階的專業課程講師介紹如下大印(周紹印),前水晶石遊戲專業負責人,從業經驗10年,製作項目包括龍與地下城,ea棒球,英雄連,吉他英雄,臺灣IClone項目等國際國內作品,還編撰了《傳奇 ZBrush數字雕刻大師之路》等圖書(點擊閱讀原文下載教學)教程截圖介紹
  • Python數據處理庫pandas入門教程
    本文是對它的一個入門教程。pandas提供了快速,靈活和富有表現力的數據結構,目的是使「關係」或「標記」數據的工作既簡單又直觀。它旨在成為在Python中進行實際數據分析的高級構建塊。通常情況下,我們可以通過pip來執行安裝:目前(2018年2月)pandas的最新版本是v0.22.0(發布時間:2017年12月29日)。我已經將本文的源碼和測試數據放到Github上: pandas_tutorial ,讀者可以前往獲取。另外,pandas常常和NumPy一起使用,本文中的源碼中也會用到NumPy。
  • Python 數據處理庫 pandas 進階教程
    /在前面一篇文章中,我們對pandas做了一些入門介紹。本文是它的進階篇。在這篇文章中,我們會講解一些更深入的知識。前言本文緊接著前一篇的入門教程,會介紹一些關於pandas的進階知識。建議讀者在閱讀本文之前先看完pandas入門教程。 同樣的,本文的測試數據和源碼可以在這裡獲取: Github:pandas_tutorial 。
  • 172份BIM精講教程,新手進階高級工程師只需4個月
    172份BIM精講教程,新手進階高級工程師只需4個月BIM技術在提高生產效率、節約成本和縮短工期方面發揮重要作用,現代建築行業越來越離不開它。隨著城市基礎設施的深入建設開展,國家層面也大力支持發展BIM技術。
  • Pandas進階修煉120題|完整版
    每晚九點,我們準時相約  作者:劉早起來源:早起python,禁止二次轉載『Pandas進階修煉
  • 微軟再推免費在線 Python 教程,面向數據科學和機器學習初學者
    去年九月,微軟曾面向 Python 初學者,推出了一套免費的教程視頻。從基本介紹和 VS Code 的配置講起,循序漸進語法概念等基礎內容講解。目前為止,該系列視頻播放量已達到將近 180 萬次。近日,微軟在此基礎上,再度更新兩個針對 Python 初學者的系列教程,作為對之前教程的補充,或者說是進階。因此,這兩個新的系列面向的不完全是純粹的 Python 新手,而是對 Python 稍有了解,並可能有其他語言的編碼經驗的人。
  • 微軟再推免費在線Python教程 面向數據科學和機器學習初學者
    去年九月,微軟曾面向 Python初學者,推出了一套免費的教程視頻。從基本介紹和 VS Code 的配置講起,循序漸進語法概念等基礎內容講解。目前為止,該系列視頻播放量已達到將近 180 萬次。  近日,微軟在此基礎上,再度更新兩個針對 Python 初學者的系列教程,作為對之前教程的補充,或者說是進階。
  • Pandas進階Excel(一)——讀取
    今天開始介紹python可以操作Excel的另一個強大的庫——pandas庫。個人認為,pandas庫對於操作Excel有著極好的支撐。在數據導入、數據清洗、數據計算、數據導出都有著完整性的支撐,是一個提供高性能易用數據類型和分析工具,並且用一段時間你就會發現如果拿pandas只操作表格數據,是真的大材小用。 它不僅可以處理數據,更可以可視化數據。譬如可以做出這樣的圖表。
  • Pandas從小白到大師學習指南
    這是一篇最佳實踐教程,既適合用過 Pandas 的讀者,也適合沒用過但想要上手的小白。通過本文,你將有望發現一到多種用 pandas 編碼的新方法。在閱讀本文時,我建議你閱讀每個你不了解的函數的文檔字符串(docstrings)。簡單的 Google 搜索和幾秒鐘 Pandas 文檔的閱讀,都會使你的閱讀體驗更加愉快。
  • 《命運2》新手如何快速進階 新手進階心得分享
    新手怎麼快速進階呢?有沒有什麼技巧呢?一起來看看吧。 武器這一方面,大家常規追求的應該有這幾個:劍狙,山巔,蜘蛛,... 在命運2中,玩家在完成新手任務後,就會開始打一些更難的副本,考慮進入更高的階段。新手怎麼快速進階呢?有沒有什麼技巧呢?一起來看看吧。
  • 從零開始進階數據分析大師
    ……現在再也不用煩惱了,以上問題,統統幫你解決小蚊子聯合張文彤老師等名師推出《從零開始進階數據分析大師》系列課程,有編程方向的,也有非編程方向的,大家可以根據自己的特點進行選擇學習,幫你從小白一步步進階到數據分析大師
  • 精心整理 | 非常全面的Pandas入門教程
    熟練並掌握pandas常規用法是正確構建機器學習模型的第一步。如何安裝pandas2. 如何導入pandas庫和查詢相應的版本信息3. pandas數據類型4. series教程5. dataframe教程6.
  • 吉他新手教學入門教程,初學者怎麼學吉他?
    吉他新手教學入門教程,初學者怎麼學吉他?吉他教學入門、吉他新手入門教學、吉他教學入門教程、初學者怎麼學吉他?【教程】吉他自學教程,讓文藝與你同在!很多同學會說,想肯定想過,只是苦於沒有人教也沒有合適的教程,所以自己只能是觀眾。今天,「喬姐」給大家帶來一整套吉他自學教程,幫助大家拿起這個普通人也能拿起的樂器。你能學會的絕不僅僅是《小星星》!!!
  • 星露谷MOD新手進階教程(一):微調MOD功能
    點擊藍字關注我,獲取第一手星露谷MOD更新,沒有中間商賺差價這是針對新農夫們的第一篇進階MOD教程。新手教程裡講述了安裝MOD的四個過程,前三個過程都寫了教程,現在我們講解最後一步:對MOD進行功能上的微調。
  • 《太吾繪卷》新手進階玩法圖文教程 新手入門教學攻略
    導 讀 太吾繪卷新手進階玩法怎麼玩?
  • 【新教學上架】Unreal Engine 4(虛幻引擎4)實用藍圖進階案例教程
    Unreal Engine 4(虛幻引擎4)實用藍圖進階案例教程本教程以多個案例展示通過編寫一定的程序性機制來實現可在關卡中反覆調取並進行變化的藍圖實例