做一個Pandas專家,教你如何用它高效處理大量資料
Pandas庫是Python最流行的資料操作庫。它提供了一種通過資料框架api操縱資料的簡便方法,靈感來自R的資料框架。
瞭解Pandas庫
瞭解Pandas的關鍵之一是瞭解Panda主要是一系列其他Python庫的包裝器。主要是Numpy、SQLAlchemy、Matplotlib和openpyxl。
資料框架的核心內部模型是一系列numpy陣列,而現在已棄用的“as_matrix”返回的Panda函式會形成內在表徵。
Pandas利用其他庫來獲取資料幀和資料幀,例如,SQLAlchemy通過read_sql和to_sql函式使用。openpyxl和xlsx writer用於read_excel和to_excel函式。
Matplotlib和Seaborn使用諸如df.plot()之類的命令,提供了一個簡單的介面來繪製資料幀中可用的資訊。
Numpy的Pandas - 高效的Pandas
您經常聽到的抱怨之一是Python速度慢或難以處理大量資料。通常情況下,這是由於編寫的程式碼效率低下。確實,原生Python程式碼往往比編譯程式碼慢,但像Panda這樣的庫可以有效地為Python程式碼提供編譯程式碼的介面。讓我們瞭解如何正確地與它進行互動,讓我們充分利用Pandas / Python。
應用向量化操作
與其底層庫Numpy一樣,Panda比執行迴圈更能有效地執行向量化操作。這些效率是由於通過C編譯程式碼執行的向量化操作,而不是原生Python程式碼以及向量化操作在整個資料集上操作的能力。
apply介面允許通過使用CPython介面進行迴圈來獲得一些效率:
df.apply(lambda x: x['col_a'] * x['col_b'], axis=1)
但大多數效能增益都可以通過使用向量化操作本身獲得,無論是直接在Pandas中還是直接呼叫其內部Numpy陣列。
從上圖中可以看出,在使用向量化操作(3.53ms)處理和使用Apply進行加法(27.8s)迴圈之間,效能差異可能非常大。通過直接呼叫numpy的陣列和API可以獲得額外的效率,例如:
Swifter:Swifter是一個Python庫,可以很容易地在資料幀上對不同型別的操作進行向量化,其API與Apply函式的API非常相似。
通過DTYPES高效地儲存資料
當將資料幀載入到記憶體中時,無論是通過read_csv,還是read_excel或其他一些資料幀讀取函式,SQL都會進行型別推斷,這可能被證明是低效的。這些API允許您顯式指定每列的型別,也允許在儲存器中更有效地儲存資料。
df.astype({'testColumn': str, 'testCountCol': float})
Dtypes是Numpy的原生物件,它允許您定義用於儲存某些資訊的確切型別和位數。
Numpy的dtype np.dtype('int32')表示一個32位長的整數。 Pandas預設為64位整數,我們可以使用32位節省一半的空間:
memory_usage()顯示每列使用的位元組數,因為每列只有一個條目(行),每個int64列的大小為8位元組,int32為4位元組。
Pandas還引入了分類dtype,它允許對頻繁出現的值進行有效的記憶體利用。在下面的示例中,當我們將欄位transition_date轉換為分類值時,我們可以看到欄位mailing_date的記憶體利用率降低了28倍。
在我們的示例中,只需更改此資料型別,資料框的總體大小就會下降3倍以上:
使用正確的dtypes不僅可以處理記憶體中較大的資料集,它還使一些計算變得更有效。在下面的示例中,我們可以看到使用分類型別為groupby / sum操作帶來了3倍的速度提升。
在Pandas中,您可以在資料載入(read_)期間定義dtypes或作為型別轉換(astype)定義dtypes。
CyberPandas:CyberPandas是不同的庫擴充套件之一,它通過支援ipv4和ipv6資料型別,並有效地儲存它們來實現更豐富的資料型別。
使用塊處理大型資料集
Pandas允許通過塊載入資料幀中的資料,因此可以將資料幀作為迭代器處理,並且能夠處理大於可用記憶體的資料幀。
在讀取資料來源時定義chunksize和get_chunk方法的組合允許Pandas將資料作為迭代器進行處理。例如,在上面所示的示例中,資料幀每次讀取2行。然後可以通過以下方式迭代這些塊:
i = 0 for a in df_iter: # do some processing chunk = df_iter.get_chunk() i += 1 new_chunk = chunk.apply(lambda x: do_something(x), axis=1) new_chunk.to_csv("chunk_output_%i.csv" % i )
然後可以將其輸出提供給csv檔案、pickle,匯出到資料庫等...
通過塊設定操作符還允許通過多處理來執行某些操作。
Dask:它是一個建立在Pandas之上的框架,它構建了多處理和分散式處理。它利用記憶體和磁碟上的Pandas資料幀集合。
SQL Alchemy的Pandas - 資料庫Panda
Pandas也建立在SQLAlchemy之上,用於與資料庫連線,因此它能夠從不同的SQL型別的資料庫下載資料集並將記錄推送到資料庫。使用SQLAlchemy介面(而不是使用Pandas API)直接允許我們執行Pandas本身不支援的某些操作,例如事務或upsert:
SQL 事務
Pandas還可以使用SQL事務,處理提交和回滾。Pedro Capelastegui在他的一篇部落格文章中解釋說,Pandas如何通過SQLAlchemy上下文管理器利用事務。
with engine.begin() as conn: df.to_sql( tableName, con=conn, ... )
如果資料載入失敗,使用SQL事務的優點是事務將回滾。
SQL擴充套件
PandaSQL
Pandas有一些SQL擴充套件,例如pandasql,它允許在資料幀之上執行SQL查詢。通過pandasql,可以直接查詢資料框物件,就好像它們是資料庫表一樣。
SQL 插入
在支援此功能的資料庫上,Panda本身不支援對SQL的upsert匯出。 Pandas的補丁允許此功能。
MatplotLib / Seaborn - 視覺Pandas
Matplotlib和Seaborn視覺化已經整合在一些資料幀API中,例如通過.plot命令。在pandas網站上有一個相當全面的文件介紹了該介面的工作原理。
擴充套件:存在不同的擴充套件,例如Bokeh和可在Jupyter筆記本中提供互動式視覺化的plotly,同時還可以擴充套件matplotlib來處理3D圖形。
其他擴充套件
還存在很多其他的Pandas擴充套件,它們可以處理非核心功能。其中一個是tqdm,它為某些操作提供了進度條功能,另一個是PrettyPandas,它允許格式化資料幀並新增摘要資訊。
tqdm
tqdm是Python中與Pandas互動的進度條擴充套件,它允許使用者在使用相關函式(progress_map和progress_apply)時檢視地圖的進度並對Panda資料幀應用操作:
PrettyPandas
PrettyPandas是一個庫,它提供了一種簡單的方法來格式化資料框並向其新增表摘要:
源:https://www.toutiao.com/a6703411317681684995/