posit::conf 將於 9 月 14 日至 16 日在德州休士頓舉行!立即註冊,親臨現場或線上參與。
使用 Python Polars 進行資料轉換、分析與視覺化的快速參考指南。
Polars 是一個用於資料轉換、分析與視覺化的函式庫,擁有快速且表達力強的 DataFrame API。它由 Ritchie Vink 於 2020 年首次發布。
從終端機安裝 Polars 及其所有選用依賴項:
在 Python 中匯入 Polars,並確認已安裝的 Polars 及其依賴項版本:
Polars 查詢通常會讀取資料、轉換資料,然後將結果寫回。一個完整的查詢通常是單一的方法呼叫鏈:
在本速查表中,df 代表 DataFrame,lf 代表 LazyFrame,o 代表要與 df 合併的第二個 DataFrame,e 代表任何表達式。因此,e.abs() 表示「對表達式呼叫 .abs()」,例如 pl.col("x").abs()。
Polars 將所有資料儲存在 Series 或 DataFrame 中。
與 pandas 不同,Polars DataFrame 沒有列索引,其 API 傾向於不可變性與方法鏈,而非原地修改。
透過傳入名稱和值序列來建立 Series:
從欄位字典建立 DataFrame,其中每個值都是 Series 或純 Python 序列。您也可以使用任何 pl.read_*() 函數從檔案建立 DataFrame:
由於沒有列索引,當您需要時,請將其明確添加為一個欄位:
將 DataFrame 轉換為 LazyFrame。或者,直接使用任何 pl.scan_*() 函數從 LazyFrame 開始:
Eager API 會立即執行,而 Lazy API 則會先建立一個優化的查詢計畫。優化器會自動應用述詞下推(盡早過濾)和投影下推(捨棄永不使用的欄位)。
您可以使用 .lazy() 和 .collect() 在這兩種表示法之間切換:.lazy() 將 DataFrame 轉換為 LazyFrame,而 .collect() 執行 LazyFrame 並返回一個 DataFrame。
將 DataFrame 轉換為 LazyFrame,並執行 LazyFrame 以取得 DataFrame:
使用串流引擎來處理記憶體外的資料,以便仍能處理大於記憶體容量的資料集:
將優化的查詢計畫以文字形式列印出來,或以圖形視覺化,以了解優化器所做的決定:
執行查詢並返回每個節點的計時,這能告訴您時間實際花在哪裡:
Polars 實作了大部分的 Apache Arrow 記憶體規格,這是一種用於扁平化和階層式資料的高效欄式格式。
取得欄位名稱和資料類型的字典,或僅取得資料類型的列表:
每欄列印一行,包含資料類型,這對於列印 DataFrame 本身難以閱讀的寬 DataFrame 非常有用:
計算每個欄位的摘要統計資料,包括 null 的數量:
報告 DataFrame 的記憶體大小,單位可自行指定:
將欄位轉換為另一種資料類型。預設情況下,轉換是嚴格的,因此不符合的值會引發錯誤:
傳入 strict=False 以在不引發錯誤的情況下進行轉換。溢位目標類型的數值將變為 null:
Polars 有四種輸入輸出函數系列,您想要哪一種取決於您是使用 eager 還是 lazy 模式:
並非所有格式都支援所有四種操作:
這些函數接受的關鍵字參數包括 schema_overrides、n_rows、row_index_name、storage_options 和 compression。
透過傳入帶有 glob 模式的 URI 來掃描雲端儲存中的檔案,並使用 storage_options 提供憑證和區域設定:
將查詢直接串流到分割的 Parquet 資料集,為每個鍵欄位的不同值寫入一個目錄:
根據欄位的名稱、資料類型或位置保留欄位。
選取表達式的結果,以便在輸出時轉換欄位:
使用關鍵字參數為表達式的結果命名,這會產生一個新欄位:
選取名稱符合正規表達式的欄位。模式必須以 ^ 開頭並以 $ 結尾:
使用欄位選擇器以獲得更大的靈活性。它們可以使用集合運算符 |、&、-、^ 和 ~ 組合。
匯入 selectors 模組,然後按資料類型或名稱模式選取欄位。另請參閱 cs.string()、cs.contains() 和 cs.first():
捨棄欄位而不是保留它們。傳入 strict=False,以便不存在的名稱被忽略而不是引發錯誤:
新欄位會添加到現有欄位的右側。
添加一個由表達式計算的新欄位,並使用關鍵字參數命名:
透過產生同名表達式來取代現有欄位。在此,欄位 a 中的 null 值被零取代:
添加一個在每一行中具有相同文字值的欄位:
添加一個列索引欄位。使用 offset 開始計數,而不是從零開始:
根據一個或多個欄位或表達式的值保留列。
透過傳入現有布林欄位的名稱來篩選:
傳入多個表達式以邏輯 AND 組合它們。您也可以明確地使用 & 寫入 AND,這種情況下每個比較都需要自己的括號:
使用關鍵字參數約束進行篩選,這是測試相等性並將結果與 AND 組合的簡寫:
保留沒有任何遺失值的列,或將檢查限制在特定欄位:
移除重複的列。使用 subset 來決定哪些欄位定義了重複,並使用 keep 來選擇哪個重複項保留下來:
保留第一列或最後幾列。兩者預設都為五:
透過給定偏移量和長度來保留連續的切片。這會保留第三列到第七列:
抽取列的隨機樣本。使用 with_replacement=True 以允許同一列被抽取多次,或使用 fraction 以抽取比例而非固定數量:
根據一個或多個欄位或表達式的值重新排序列。
按單一欄位排序(預設為升序),或按多個欄位順序排序:
將 null 值移到結尾而不是開頭:
反轉順序。當按多個欄位排序時,傳入布林值列表以設定每個欄位的方向:
按表達式的結果排序,而不是按欄位排序,例如計算出的比例或列表長度:
僅保留根據欄位排序的前 k 列或後 k 列,這比對所有內容進行排序然後切片更便宜:
從寬格式轉為長格式,反之亦然。
透過將一個或多個欄位的值轉換為列,使 DataFrame 更長,同時將索引欄位保留為識別符:
透過將一個欄位的值轉換為新欄位,使 DataFrame 更寬。如果 on 和 index 的組合不是唯一的,請提供 aggregate_function 來決定如何合併衝突:
展開列表欄位,使每個元素獲得自己的列,並重複其他欄位:
展開結構體欄位,使每個欄位成為自己的欄位:
交換列和列。使用 include_header=True 以將原始欄位名稱保留為一個欄位:
將 DataFrame 分割成一個較小 DataFrame 的列表,每個給定欄位的不同值一個:
按一個或多個欄位將 DataFrame 分割成群組。這會為您提供一個 GroupBy 物件,然後您可以對其進行聚合:
對每個群組應用現成的摘要。計算每個群組的列數,取每個群組的第一列,或計算每個群組的平均值:
當沒有內建聚合適用時,將您自己的函數應用於每個群組:
使用 agg() 進行完全控制的聚合。傳入沒有聚合方法的表達式會將值收集到一個列表中,並使用關鍵字參數命名結果會為新欄位提供一個合理的名稱:
使用帶有 over() 的視窗表達式,將聚合作為一個新欄位添加到原始 DataFrame 中,而不會折疊列:
按時間值或索引分組,而不是按類別分組。group_by_dynamic() 建立固定持續時間的視窗,而 group_by 在其之上添加常規分組:
使用 rolling() 處理一個隨每一行移動而不是固定步長的視窗。這會計算每個商店每日銷售額的七日滾動總和:
建立常規時間序列中遺失的列,以便表示每個間隔:
跨欄位而不是向下欄位進行聚合。水平函數在每一行內組合多個欄位:
將多個 DataFrame 合併成一個。
在共享鍵上連接兩個 DataFrame。預設是內連接,它只保留兩邊匹配的列:
使用 how 來選擇不同的連接策略。左連接保留 df 的所有列:
當鍵在兩個 DataFrame 中具有不同的名稱時,明確命名兩邊:
全外連接保留兩邊的所有列。添加 coalesce=True 以將兩個鍵欄位合併為一個:
篩選連接僅返回 df 中的列,並將 o 純粹用作篩選器。半連接保留 df 中有匹配的列,而反連接保留沒有匹配的列:
交叉連接產生兩個 DataFrame 的笛卡爾積,因此不需要鍵:
連接到最近的匹配項,而不是精確匹配,這是對齊兩個時間序列的常用方法。使用 by 先按某些欄位進行精確匹配:
對不等式或其他非等值連接的任意謂詞進行連接:
df.join() 的常見關鍵字參數包括 left_on、right_on、coalesce、join_nulls、suffix 和 validate,其中 validate 接受 "m:m"、"m:1"、"1:m" 和 "1:1"。
將 DataFrame 堆疊在一起,這需要匹配的欄位:
將 DataFrame 並排放置,或取它們欄位的並集並用 null 填充空缺:
使用寬鬆策略來強制轉換不匹配的資料類型,而不是引發錯誤:
使用另一個 DataFrame 中的非 null 值更新 df 中的值,按鍵匹配列:
表達式是操作的樹狀結構,描述如何建構一個或多個 Series。
每個表達式都從一個欄位、所有欄位或一個文字值開始。
基於現有欄位、所有欄位或文字值建構表達式。請注意,pl.col("*") 和 pl.all() 是等效的:
生成一個整數範圍,其中停止值是排他的。這會產生 [0, 1, 2, 3, 4]:
生成一個日期範圍。單數形式產生一個範圍,而複數形式為每一列產生一個範圍的欄位。整數、時間和日期時間有各自的 *_range() 和 *_ranges() 函數:
您可以使用表達式和純 Python 值進行算術運算。每個運算符都有一個等效的方法,當您希望保持方法鏈不中斷時非常方便。
與 Python 不同,您不能鏈式連接多個比較。請寫 (pl.col("x") > 0) & (pl.col("x") < 10),而不是 0 < pl.col("x") < 10。
請注意,and、or 和 not 是 Python 中的保留關鍵字,因此方法名稱中帶有底線。
鏈接 when() 和 then() 來建構條件表達式,並用 otherwise() 關閉。條件按順序評估,第一個匹配獲勝,因此請將最特定的條件放在前面:
在 Polars 中,null 表示遺失,而 NaN 是由未定義數學運算(如 0 / 0)產生的浮點數。這兩者由單獨的方法處理。
陣列具有固定長度;列表則沒有。陣列方法位於 arr 命名空間下,列表方法位於 list 命名空間下。
將欄位轉換為固定長度的陣列,然後使用陣列命名空間:
將多個欄位合併為單一列表欄位:
處理列表欄位的內容:取得每個列表的長度、按索引取得元素、對列表內的元素進行排序、將它們連接成單一字串,或測試某個值是否存在:
Categoricals 從資料中推斷其類別並按詞彙排序,而 Enums 則預先固定並按宣告順序排序。
將字串欄位轉換為 Categorical,或轉換為具有確切允許值集合的 Enum:
檢索 Categorical 欄位最終擁有的類別:
日期追蹤天數,而日期時間追蹤微秒。處理它們的方法位於 dt 命名空間下。
從其組成部分建構日期、日期時間或持續時間:
提取單一組成部分,例如月份:
替換單一時間單位,保持其餘部分不變:
使用格式規範將日期時間格式化為字串:
將日期時間轉換為另一時區:
將持續時間表示為秒數:
字串是 UTF-8,因此長度和切片計算的是字元而不是位元組。字串方法位於 str 命名空間下。
結構體將多個欄位分組為單一列元素。結構體方法位於 struct 命名空間下。
將欄位合併為結構體,然後將單一欄位提取回來:
重新命名結構體的欄位,或新增和調整欄位:
使用 bin 命名空間處理原始位元組資料以及 base64 和十六進位轉換。
解碼 base64 字串,或將位元組編碼為十六進位字串:
使用 name 命名空間控制表達式的最終欄位名稱。
在現有名稱前添加前綴,或將其小寫:
內省方法,主要用於編寫外掛程式,位於 meta 命名空間下。
使用 Great Tables 將 DataFrame 轉換為可供展示的表格。從 GT(df) 開始,並鏈接設定存根和標頭、格式化值以及添加顏色的方法:
內建的繪圖方法使用 Altair 作為後端,並可從 plot 命名空間取得:
許多其他套件可以直接處理 Polars DataFrame,包括 Plotnine、Plotly、hvPlot、Seaborn 和 Matplotlib。對於任何無法直接處理的情況,請先使用 df.to_pandas() 轉換為 pandas:
在您自己的環境中的叢集實例上執行查詢。使用 ComputeContext 描述您想要的計算,然後針對該計算遠端執行 LazyFrame:
本速查表基於 Jeroen Janssens 和 Thijs Nieuwdorp 的書籍《Python Polars: The Definitive Guide》,由 O’Reilly 出版。該書有印刷版和電子書格式,可在您最喜歡的書店購買。詳情請訪問 polarsguide.com。
使用 Python 製作出色的顯示表格。
資料科學的開源軟體與工具。
訪問 posit.co 了解我們的企業產品如何讓您更安全、更協作、更大規模地使用開源工具。