在pandas中使用pipe()提升代碼可讀性

2021-01-10 TechWeb

1. 簡介

我們在利用pandas開展數據分析時,應儘量避免過於「碎片化」的組織代碼,尤其是創建出過多不必要的「中間變量」,既浪費了「內存」,又帶來了關於變量命名的麻煩,更不利於整體分析過程代碼的可讀性,因此以流水線方式組織代碼非常有必要。

 

而在以前我撰寫的一些文章中,為大家介紹過pandas中的eval()和query()這兩個幫助我們鏈式書寫代碼,搭建數據分析工作流的實用API,再加上下面要介紹的pipe(),我們就可以將任意pandas代碼完美組織成流水線形式。

2.  在pandas中靈活利用pipe()pipe()

顧名思義,就是專門用於對Series和DataFrame操作進行流水線(pipeline)改造的API,其作用是將嵌套的函數調用過程改造為「鏈式」過程,其第一個參數func傳入作用於對應Series或DataFrame的函數。

具體來說pipe()有兩種使用方式,「第一種方式」下,傳入函數對應的第一個位置上的參數必須是目標Series或DataFrame,其他相關的參數使用常規的「鍵值對」方式傳入即可,就像下面的例子一樣,我們自編函數對「泰坦尼克數據集」進行一些基礎的特徵工程處理:

import pandas as pd  train = pd.read_csv('train.csv')  def do_something(data, dummy_columns):     '''     自編示例函數     '''      data = (         pd         # 對指定列生成啞變量         .get_dummies(data, # 先刪除data中指定列                      columns=dummy_columns,                      drop_first=True)     )          return data  # 鏈式流水線 (     train     # 將Pclass列轉換為字符型以便之後的啞變量處理     .eval('PclassPclass=Pclass.astype("str")', engine='python')     # 刪除指定列     .drop(columns=['PassengerId', 'Name', 'Cabin', 'Ticket'])     # 利用pipe以鏈式的方式調用自編函數     .pipe(do_something,            dummy_columns=['Pclass', 'Sex', 'Embarked'])     # 刪除含有缺失值的行     .dropna() ) 

可以看到,在緊接著drop()下一步的pipe()中,我們將自編函數作為其第一個參數傳入,從而將一系列操作巧妙地嵌入到鏈式過程中。

「第二種使用方式」適合目標Series和DataFrame不為傳入函數第一個參數的情況,譬如下面的例子中我們假設目標輸入數據為第二個參數data2,則pipe()的第一個參數應以(函數名, '參數名稱')的格式傳入:

def do_something(data1, data2, axis):     '''     自編示例函數     '''      data = (         pd         .concat([data1, data2], axisaxis=axis)     )          return data  # pipe()第二種使用方式 (     train     .pipe((do_something, 'data2'), data1=train, axis=0) ) 

在這樣的設計下我們可以避免很多函數嵌套調用方式,隨心所欲地優化我們的代碼~

 

相關焦點

  • 從小白到大師,這裡有一份Pandas入門指南
    在代碼中,指定 deep=True 來確保考慮到了實際的系統使用情況。它可以通過兩種簡單的方法節省高達 90% 的內存使用:了解數據框使用的類型;了解數據框可以使用哪種類型來減少內存的使用(例如,price 這一列值在 0 到 59 之間,只帶有一位小數,使用 float64 類型可能會產生不必要的內存開銷)除了降低數值類型的大小(用 int32 而不是 int64)外,Pandas 還提出了分類類型:https://pandas.pydata.org/
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。不等連接(Non-equi join)假設你必須連接兩個dataframe。其中一個顯示了我們對某些商品進行促銷的時間段。第二個是事務Dataframe。
  • 懶人秘籍:教你如何避免編寫pandas代碼
    而大家都在儘可能地避免這種懸崖峭壁,結果可想而知,都轉向了如何避免編寫pandas代碼。在過去4年裡,筆者一直使用pandas作為數據分析的主要工具。必須承認,「如何避免編寫pandas代碼」的大部分內容來自於使用pandas編程的起步階段。在進行代碼審閱時,筆者仍然看到許多經驗豐富的程式設計師在看一些熱門「如何避免使用」的帖子。
  • 嫌pandas慢又不想改代碼怎麼辦?來試試Modin
    最近看到了一篇也是關於對pandas提速的文章,但是從另一個角度,工具。使用它可以很好的突破操作優化上的瓶頸,而這個工具就是Modin。Modin存在的意義就是:更改一行代碼來提速pandas工作流程。Pandas在數據科學領域就無需介紹了,它提供高性能,易於使用的數據結構和數據分析工具。
  • 如何使用Pandas-Profiling進行探索性數據分析
    Pandas-profiling是一個開源Python庫,它只需一行代碼即可為任何機器學習數據集生成漂亮的交互式報告。pandas_profiling使用df.profile_report()擴展了DataFrame,以便進行快速數據分析。
  • pandas使用的25個技巧
    查詢pandas版本  如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數:查看創建的示例DataFrame  我更喜歡在選取pandas列的時候使用點(.),但是這對那麼列名中含有空格的列不會生效。讓我們來修復這個問題。  更改列名最靈活的方式是使用rename()函數。
  • Pandas的介紹與基本使用
    1、什麼是Pandas當大家談論到數據分析時,提及最多的語言就是Python和SQL,而Python之所以適合做數據分析,就是因為他有很多強大的第三方庫來協助,pandas就是其中之一,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。
  • 停止使用Pandas並開始使用Spark+Scala
    · Spark是Apache開源框架  · 它可用作庫並在"本地"集群上運行,或在Spark集群上運行  · 在Spark集群上,可以以分布式方式執行代碼,其中一個主節點和多個工作節點共享負載  · 即使在本地群集上,您仍然可以看到與Pandas相比的性能提升,我們將在下面介紹原因  為什麼要使用Spark?
  • Python學習120課 pandas簡介kaggle下載數據及pandas讀取外部數據
    numpy的基本的東西我們學習差不多了,後面具體應用中遇到問題具體分析,然後去深入了解遇到的新的知識點就行。現在我們開始學習pandas,pandas一般用的更多,pandas是基於numpy去寫的。pandas是一個專門做數據結構和數據分析的庫。
  • pandas指南:做更高效的數據科學家
    今天我要告訴你們的是:在數據科學中,有一個軟體包是你們絕對需要學習的,那就是pandas。而pandas真正有趣的地方是,很多其他的包也在裡面。pandas是一個核心包,因此它具有來自其他各種包的特性。pandas類似於Python中的Excel:它使用表(即DataFrame)並對數據進行轉換,但它還能做更多。
  • Pandas on Ray:僅需改動一行代碼,即可讓Pandas加速四倍
    本文中,來自 UC Berkeley 的 Devin Petersohn 發布文章介紹了其參與的項目 Pandas on Ray,使用這款工具,無需對代碼進行太多改動即可加速 Pandas,遇到大型數據集也不怕。作者還對 Pandas on Ray、Pandas 進行了對比評估。機器之心對此文進行了編譯介紹。
  • 提高數據處理效率,一行代碼開啟Pandas四倍速!
    快來了解新庫Modin,可以分割pandas的計算量,提高數據處理效率,一行代碼即刻開啟Pandas四倍速。首先了解一些基礎知識:Pandas作為Python中用於處理數據的庫,能簡單且靈活地處理不同種類、大小的數據。除此之外,Pandas還有許多函數有助於輕鬆處理不同數據。
  • python時間序列分析之_用pandas中的rolling函數計算時間窗口數據
    上篇文章中,我們講解了如何對時間數據進行重採樣及重採樣中降採樣和升採樣的概覽和使用方法,通過重採樣我們可以得到任何想要頻率的數據,但是這些數據也是一個時點的數據,那麼就存在這樣一個問題:時點的數據波動較大,某一點的數據不能很好的表現它本身的特性,於是我們就想,能否用一個區間的的數據去表現呢,這樣數據的準確性是不是更好一些呢?
  • 圖解四個實用的pandas函數!
    作者:Baijayanta Roy來源:towardsdatascience編譯&內容補充:早起Python在用python進行機器學習或者日常的數據處理中,pandas是最常用的Python庫之一,熟練掌握pandas是每一個數據科學家的必備技能,本文將用代碼+圖片詳解Pandas中的四個實用函數!
  • 如何在Python中編寫簡單代碼,並且速度超越Spark?
    在小型數據集上使用pandas時,其性能表現不錯,但這隻發生在整個數據集適合內存且在pandas和NumPy層下使用已優化的C代碼進行處理的情況下。處理大量數據包含集中的的IO操作、數據轉換、數據拷貝等,拖慢了處理的速度。從本質上講,臭名昭著的GIL 給Python帶來了線程同步的困難,在處理複雜任務時非常低效,異步Python相對更好,但其開發複雜且無法解決固有的鎖定問題。
  • 使用pandas和openpyxl處理複雜Excel數據
    關於Excel數據處理,很多同學可能使用過Pyhton的pandas模塊,用它可以輕鬆地讀取和轉換Excel數據。但是實際中Excel表格結構可能比較雜亂,數據會分散不同的工作表中,而且在表格中分布很亂,這種情況下啊直接使用pandas就會非常吃力。本文蟲蟲給大家介紹使用pandas和openpyxl讀取這樣的數據的方法。
  • 15個應該掌握的Jupyter Notebook 使用技巧
    代碼格式自動補全有時jupyter notebook單元格中的代碼段格式不好,通過nb_black庫,可以自動調整代碼段的正確格式,讓代碼具有更好的可讀性。安裝nb_black庫:pip3 install nb_black在jupyter notebook 中使用:%load_ext nb_black格式混亂的代碼段自動調整後的代碼段4. 下載並安裝Python庫Jupyternotebook可以通過在單元格內輸入!
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    pandas(pannel data analysis,面板數據分析),我個人覺得pandas用於數據分析處理有別於Python字典和列表的主要在於以下三點。運算效率提升,pandas是基於numpy寫的,換句話說也是c語言進行編寫並編譯成本地庫的,在運算效率會高很多。消耗資源少,因為pandas採用矩陣運算,在算法結構上比列表和字典組合數據消耗更少資源。
  • 如何用pandas更快地進行數據可視化?
    基本使用,學會製作套路首先我們使用pandas隨機生成示例數據import pandas as pddf= pd.DataFrame(np.random.rand(8, 4), columns=['A','B','C','D'])
  • 快速介紹Python數據分析庫pandas的基礎知識和代碼示例
    為了能夠快速查找和使用功能,使我們在進行機器學習模型時能夠達到一定流程化。我創建了這個pandas函數的備忘單。這不是一個全面的列表,但包含了我在構建機器學習模型中最常用的函數。讓我們開始吧!我們還可以使用df.to_excel()保存和寫入一個DataFrame到Excel文件或Excel文件中的一個特定表格。