數據處理必看:如何讓你的 pandas 循環加快 71803 倍

2021-01-08 雷鋒網

雷鋒網 AI 開發者按,如果你使用 python 和 pandas 進行數據分析,那麼不久你就會第一次使用循環了。然而,即使是對小型數據集,使用標準循環也很費時,你很快就會意識到大型數據幀可能需要很長的時間。當我第一次等了半個多小時來執行代碼時,我找到了接下來想與你共享的替代方案。

標準循環

數據幀是具有行和列的 pandas 對象。如果使用循環,則將遍歷整個對象。python 不能用任何內置函數,而且速度非常慢。在我們的示例中,我們得到了一個具有 65 列和 1140 行的數據幀,它包含 2016-2019 賽季的足球比賽結果。我們要創建一個新的列來指示某個特定的隊是否打過平局。我們可以這樣開始:

leaguedf['Draws'] = 99999 for row in range(0, len(leaguedf)): if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \ ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')): leaguedf['Draws'].iloc[row] = 'Draw' elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \ ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')): leaguedf['Draws'].iloc[row] = 'No_Draw' else: leaguedf['Draws'].iloc[row] = 'No_Game'def soc_loop(leaguedf,TEAM,):

因為我們的數據框架中包含了英超的每一場比賽,所以我們必須檢查我們感興趣的球隊(阿森納)是否參加過比賽,是否適用,他們是主隊還是客隊。如你所見,這個循環非常慢,需要 207 秒才能執行。讓我們看看如何提高效率。

pandas 內置函數:iterrow()——快 321 倍

在第一個示例中,我們循環訪問了整個數據幀。iterrows()為每行返回一個序列,因此它以一對索引的形式在數據幀上迭代,而感興趣的列以序列的形式迭代。這使得它比標準循環更快:

def soc_iter(TEAM,home,away,ftr):#team, row['HomeTeam'], row['AwayTeam'], row['FTR'] if [((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D'))]: result = 'Draw' elif [((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D'))]: result = 'No_Draw' else: result = 'No_Game' return result

代碼運行需要 68 毫秒,比標準循環快 321 倍。但是,許多人建議不要使用它,因為仍然有更快的方法,並且 iterrows() 不保留跨行的數據類型。這意味著,如果在數據幀上使用 iterrow(),則可以更改數據類型,這會導致很多問題。要保留數據類型,還可以使用 itertuples()。我們不會在這裡詳細討論,因為我們要關注效率。你可以在這裡找到官方文件:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html?source=post_page805030df4f06--

apply()方法——快 811 倍

apply 本身並不快,但與數據幀結合使用時具有優勢。這取決於應用表達式的內容。如果可以在 Cython 空間中執行,則速度會更快(在這裡就是這種情況)。

我們可以將 apply 與 Lambda 函數一起使用。我們要做的就是指定軸。在這種情況下,我們必須使用 axis=1,因為我們要執行一個列操作:

此代碼甚至比以前的方法更快,只需要 27 毫秒就能完成。

pandas 矢量化——快 9280 倍

現在我們可以討論一個新話題了。我們利用矢量化的優點來創建真正快速的代碼。重點是避免像前面的例子 [1] 中那樣的 Python 級循環,並使用優化的 C 代碼,這個代碼使用內存的效率更高。我們只需要稍微修改函數:

df['Draws'] = 'No_Game' df.loc[((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D')), 'Draws'] = 'Draw' df.loc[((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D')), 'Draws'] = 'No_Draw' def soc_iter(TEAM,home,away,ftr):

現在我們可以用 pandas series 作為輸入創建新列:

在這種情況下,我們甚至不需要循環。我們要做的就是調整函數的內容。現在我們可以直接將 pandas series 傳遞給我們的函數,這會導致巨大的速度增益。

Numpy 矢量化——速度快 71.803 倍

在前面的示例中,我們將 pandas series 傳遞給了函數。通過添加.values,我們收到一個 Numpy 數組:

Numpy 數組非常快,我們的代碼運行時間為 0305 毫秒,比開始使用的標準循環快 71803 倍。

結論

如果您使用 python、pandas 和 Numpy 進行數據分析,那麼代碼總會有一些改進空間。我們比較了五種不同的方法,在計算的基礎上增加了一個新的列到我們的數據框架中。我們注意到在速度方面存在巨大差異:

如果你從這篇文章中選擇兩條規則,我會很高興:

如果確定需要使用循環,則應始終選擇 apply 方法否則,矢量化總是更好的,因為它更快via:https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06

雷鋒網雷鋒網

相關焦點

  • 再見 for 循環!pandas 提速 315 倍~
    >>> import pandas as pd# 導入數據集>>> df = pd.read_csv('demand_profile.csv')>>> df.head()     date_time  energy_kwh0  1/1/13 0:00       0.5861  1/1/13
  • 數據科學 | 從 Pandas 小白到 Pandas 能手
    在本文中,作者從 Pandas 的簡介開始,一步一步講解了 Pandas 的發展現狀、內存優化等問題。這是一篇最佳實踐教程,既適合用過 Pandas 的讀者,也適合沒用過但想要上手的小白。通過本文,你將有望發現一到多種用 pandas 編碼的新方法。Pandas 發展現狀;內存優化;索引;方法鏈;隨機提示。
  • Python 數據處理庫 pandas 入門教程
    pandas提供了快速,靈活和富有表現力的數據結構,目的是使「關係」或「標記」數據的工作既簡單又直觀。它旨在成為在Python中進行實際數據分析的高級構建塊。入門介紹pandas適合於許多不同類型的數據,包括:由於這是一個Python語言的軟體包,因此需要你的機器上首先需要具備Python語言的環境。關於這一點,請自行在網絡上搜索獲取方法。
  • 僅需添加一行代碼,即可讓Pandas加速四倍 | Pandas on Ray
    中處理數據的庫,但其速度優勢並不明顯。之於Pandas DataFrame,一個基本想法就是根據不同的CPU內核數量將DataFrame分成幾個不同部分,讓每個核單獨計算。最後再將結果相加,這在計算層面來講,運行成本比較低。如何提高多核系統數據處理速度。在單核系統處理過程中(左),所有10個任務都用一個CPU處理。而在雙核系統中(右),每個節點處理5個任務,處理速度提高一倍。
  • Pandas 數據處理|Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date =
  • Pandas 數據處理 | Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date
  • Python 數據分析:Pandas 進階
    概述我們在上一篇文章初識 Pandas中已經對 Pandas 作了一些基本介紹,本文我們進一步來學習 Pandas 的一些使用。2. 缺失項在現實中我們獲取到的數據有時會存在缺失項問題,對於這樣的數據,我們通常需要做一些基本處理,下面我們通過示例來看一下。
  • Python 數據處理庫 pandas 進階教程
    下面是一個代碼示例:# select_data.py import pandas as pdimport numpy as np series1 = pd.Series([1, 2, 3, 4, 5, 6, 7],    index=["C", "D", "E", "F", "G", "A", "B"]
  • 通過 SQL 查詢學習 Pandas 數據處理
    ://shzhangji.com/cnblogs/2017/07/23/learn-pandas-from-a-sql-perspective/Pandas 是一款廣泛使用的數據處理工具。結合 NumPy 和 Matplotlib 類庫,我們可以在內存中進行高性能的數據清洗、轉換、分析及可視化工作。雖然 Python 本身是一門非常容易學習的語言,但要熟練掌握 Pandas 豐富的 API 接口及正確的使用方式,還是需要投入一定時間的。對於數據開發工程師或分析師而言,SQL 語言是標準的數據查詢工具。
  • 這是 Pandas 最詳細教程了
    如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。
  • 史上最全Pandas 教程!
    如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。
  • 如何使用 Pandas 讀寫Excel
    Pandas是一個基於Numpy專業的數據結構化分析工具,可用於數據挖掘和數據分析,同時也提供數據清洗功能。其中的數據框格式將非常有利於我們對Excel表格的處理,相關介紹可以點擊上一篇內容。今天的推送主要內容圍繞讀取表格及一些參數使用,同時也徵集一下大家的使用經驗,歡迎留言。
  • Python:將XML數據存儲到Pandas DataFrame中
    可擴展標記語言(XML)是一種標記語言,它以人類和機器可讀的格式對數據進行編碼。XML在各種程序中用於構造、存儲和傳輸數據。在這篇文章中,我們將討論如何使用python xml庫中的 「ElementTree」模塊來解析xml數據並將數據存儲在panda DataFrame中。
  • 數據預處理的 10 個小技能,附 Pandas 實現
    數據預處理常用的處理步驟,包括找出異常值、處理缺失值、過濾不合適值、去掉重複行、分箱、分組、排名、category轉數值等,下面使用 pandas 解決這些最常見的預處理任務。找出異常值常用兩種方法:標準差法:異常值平均值上下1.96個標準差區間以外的值分位數法:小於 1/4分位數減去 1/4和3/4分位數差的1.5倍,大於3/4減去 1/4和3/4分位數差的1.5倍,都為異常值技能1 :標準差法
  • Python 數據處理(六)—— panda 基礎介紹
    Python 數據處理(六)前言在這裡,我們將會討論很多 pandas 數據結構所共有的基本功能函數先讓我們來創建一個示例對象In [1]: index = pd.date_range("1/1/2000", periods
  • 如何將數據處理速度提升1000+倍
    利用Python進行數據處理時經常使用的是pandas和numpy,這兩個工具的功能都很強大,尤其是pandas,更是Python中數據處理方面最強大的工具之一
  • 別找了,這是 Pandas 最詳細教程了
    如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。
  • Python數據分析實戰:用Pandas 處理時間序列
    今天我們就討論pandas在時間序列處理中應用。這裡我們採用美國能源消耗數據集進行分析和討論,數據集可以在kaggle上下載,如果有問題,可以留言討論。該數據集包含了美國一家能源公司的長達數十年的能源消耗數據,數據解析度為小時。
  • 數據科學 | 手把手教你用 pandas 索引、匯總和處理缺失數據
    pandas作為python中非常重要的數據處理工具,它提供了很多靈活的數學和統計方法。在數據處理中,經常需要對數據進行索引的轉換,以適應不同的統計和作圖的需要;另外在許多數據分析工作中,缺失數據是經常發生的。因此,作為pandas系列文章的一部分,本文將重點關注pandas對數據索引、匯總和缺失數據的處理的相關方法。
  • 如何使用Pandas處理超過內存容量的大規模數據
    處理大規模數據集時常是棘手的事情,尤其在內存無法完全加載數據的情況下。在資源受限的情況下,可以使用 Python Pandas 提供的一些功能,降低加載數據集的內存佔用。可用技術包括壓縮、索引和數據分塊。 開展數據科學項目中的一個重要步驟,就是從 API 下載數據並加載到本地內存,之後才能處理數據。在上述過程中需要解決一些問題,其中之一就是數據量過大。