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是一個庫,它提供了一種簡單的方法來格式化數據框並向其添加表摘要:
