1. データ読み込み/書き込み
様々なフォーマットのデータを効率的に読み書きします。
| 目的 | コード例 | 説明 |
|---|---|---|
| CSV読み込み | | CSVファイルをDataFrameまたはLazyFrameとして読み込みます。多数のオプションで読み込みプロセスを制御できます。scan_csvは遅延評価のため、大規模データに適しています。 |
| Parquet読み込み | | Parquetファイルを効率的に読み込みます。列指向フォーマットのため、列選択やフィルタリング (Predicate Pushdown) が高速です。scan_parquetでLazyFrameとして扱えます。 |
| JSON読み込み | | JSONまたはJSON Lines形式のファイルを読み込みます。json_lines=Trueで行区切りJSONに対応します。スキーマを事前に定義することも可能です。 |
| Excel読み込み | | Excelファイル (.xlsx) を読み込みます。シート名やエンジン、読み込みオプションを指定できます。sheet_name=Noneで全シートを読み込めます。 |
| Arrow IPC読み込み | | Apache Arrow IPC (Feather V1/V2) ファイルを高速に読み込みます。scan_ipcでLazyFrameとして、特にmemory_map=Trueでメモリ効率良く扱えます。 |
| データベース読み込み | | ADBC (Arrow Database Connectivity) または connectorx を利用してデータベースからデータを読み込みます。ADBCは比較的新しい標準で、Polarsとの親和性が高いです。read_databaseではパーティション指定による並列読み込みも可能です。 |
| データ書き込み (各種フォーマット) | | DataFrameの内容を各種ファイルフォーマットで書き出します。LazyFrameの場合はsink_*メソッドを使用し、ストリーミング処理により大規模データもメモリ効率良く書き出せます。 |
2. データフレーム/シリーズの基本操作
データフレームやシリーズの構造を確認したり、基本的な属性を変更します。
| 目的 | コード例 | 説明 |
|---|---|---|
| データフレーム作成 | | 様々なデータソースからPolars DataFrameを作成します。辞書、リスト、NumPy配列、Pandas DataFrame、Polars Seriesなどから生成できます。 |
| 情報表示 | | DataFrameの基本的な情報を表示します。データの中身、サイズ、データ型、統計量などを確認できます。 |
| 列名変更 | | 列名を変更します。辞書で個別に指定するか、関数を適用して一括で変更できます。 |
| データ型変換 | | 列のデータ型を変換します。castメソッドや式 (Expression) 内のcastを使用します。文字列から日時への変換など、特定の変換用メソッドもあります。 |
3. データ選択 (Selection)
DataFrameから特定の列や行を選択します。
| 目的 | コード例 | 説明 |
|---|---|---|
| 列選択 | | 特定の列を選択します。列名を文字列やリストで指定する他、式 (Expression) を使って計算結果や定数、正規表現、データ型による選択も可能です。pl.excludeで除外指定もできます。 |
| 行選択 (フィルタリング) | | 特定の行を選択します。条件式 (filter)、インデックス範囲 (slice)、先頭/末尾 (head/tail)、ランダムサンプリング (sample) などがあります。 |
| 特定の要素へのアクセス | | 特定の行やセルの値にアクセスします。row()は指定したインデックスの行をDataFrameとして返します。item()は特定のセルの値を直接取得しますが、頻繁な呼び出しは遅くなる可能性があります。 |
4. データフィルタリング (Filtering)
条件に基づいてDataFrameの行を抽出します。
| 目的 | コード例 | 説明 |
|---|---|---|
| 単一条件 | | 単一の条件式に基づいて行をフィルタリングします。pl.col("列名")で列を参照し、比較演算子 (>, <=, ==, !=) を使用します。 |
| 複数条件 (AND, OR, NOT) | | 複数の条件を組み合わせてフィルタリングします。& (AND), | (OR), ~ (NOT) を使用します。括弧 () を使って評価順序を制御します。 |
| リスト内/外の要素 | | 指定したリストに列の値が含まれるか (is_in)、含まれないか (is_not_in) でフィルタリングします。 |
| Null値のチェック | | 列の値がNullか (is_null)、Nullでないか (is_not_null) でフィルタリングします。 |
| 文字列の部分一致など | | 文字列型の列に対して、部分一致 (str.contains)、前方一致 (str.starts_with)、後方一致 (str.ends_with)、正規表現一致 (str.containsにliteral=Falseまたはstr.extract) などでフィルタリングします。 |
5. データ変換 (Transformation)
列の追加、変更、削除、値の置換、欠損値処理など、データを加工します。
| 目的 | コード例 | 説明 |
|---|---|---|
| 新しい列の追加/既存列の変更 | | with_columnsを使用して新しい列を追加したり、既存の列の値を変更したりします。複数の式をリストで渡すことで、一度に複数の列を操作できます。既存の列名と同じエイリアスを指定すると、列が上書きされます。when/then/otherwise構文で条件分岐も可能です。 |
| 列の削除 | | dropメソッドで不要な列を削除します。列名を文字列またはリストで指定します。 |
| 欠損値 (Null) 処理 | | 欠損値 (Null) を特定の値 (fill_null)、前後の値 (forward_fill, backward_fill)、または統計量 (平均値など) で補完します。drop_nullsでNullを含む行を削除することもできます。 |
| 文字列操作 | | str名前空間以下のメソッドを使って文字列を操作します。小文字化、置換、分割、空白除去、正規表現による抽出、パターンカウントなどが可能です。 |
| 日時操作 | | dt名前空間以下のメソッドを使って日時データを操作します。年、月、曜日などの要素抽出、フォーマット変換、日付/時間の加減算 (offset_by)、丸め処理 (truncate)、時間差計算などが可能です。 |
| リスト操作 | | list名前空間以下のメソッドを使ってリスト型の列を操作します。リストの長さ、合計、平均、要素へのアクセス、結合、要素の存在確認、ユニークな要素の取得などが可能です。explodeでリスト要素を行に展開することもよく使われます。 |
| 適用関数 (Apply/Map) | | Pythonのカスタム関数を適用します。applyはSeries全体に、map_elementsは要素ごとに適用します。Polarsの組み込み関数や式で表現できる場合はそちらの方が圧倒的に高速なため、これらの使用は最終手段と考えるべきです。パフォーマンスへの影響に注意してください。 |
6. データ集約 (Aggregation)
データをグループ化し、各グループに対して集約計算(合計、平均、カウントなど)を行います。
| 目的 | コード例 | 説明 |
|---|---|---|
| グループ化と集約 (GroupBy) | | group_by()でグループ化するキーを指定し、agg()で集約処理を定義します。agg()には単一の式または式のリストを渡します。pl.sum, pl.mean, pl.count, pl.n_unique, pl.first, pl.last, pl.median, pl.quantile, pl.std, pl.var など、多数の集約関数が利用可能です。グループ化キーを指定しないagg()は、DataFrame全体に対して集約を行います。 |
| 条件付き集約 | | 集約式内でfilter()を使うことで、特定の条件を満たす行だけを集約対象とすることができます。 |
| ピボット (Pivot) | | pivot()メソッドは、指定した列 (columns) のユニークな値を新しい列名とし、対応する値 (values) を集約関数 (aggregate_function) で集計して、データを整形します。いわゆる「ロング形式」から「ワイド形式」への変換です。 |
| 動的/ローリング集約 (時系列) | | group_by_dynamicは時系列データに対して、時間ベースのウィンドウ(例: 1時間ごと、過去3時間分)で集約を行います。group_by_rolling(またはover()と組み合わせたローリング関数)は、行数ベースの移動ウィンドウ(例: 直近3行)で集約を行います。時系列分析や特徴量エンジニアリングで頻繁に使用されます。 |
7. データ結合 (Joining)
複数のDataFrameを特定のキーに基づいて結合します。
| 結合の種類 | コード例 | 説明 |
|---|---|---|
| 内部結合 (Inner Join) | | 両方のDataFrameに存在するキーの行のみを結合します。 |
| 左結合 (Left Join) | | 左側のDataFrameのすべての行を保持し、右側のDataFrameから一致するキーのデータを結合します。一致しない場合はNullが入ります。 |
| 外部結合 (Outer Join) | | 両方のDataFrameのすべての行を保持し、一致するキーでデータを結合します。どちらか一方にしか存在しないキーの行も含まれ、対応する値はNullになります。 |
| クロス結合 (Cross Join) | | 左側のDataFrameの各行と右側のDataFrameの各行のすべての組み合わせを作成します (デカルト積)。結合キーは使用しません。結果の行数は M * N になります。 |
| 半結合 (Semi Join) | | 左側のDataFrameから、右側のDataFrameに一致するキーが存在する行のみを選択します。右側のDataFrameの列は結果に含まれません。フィルタリングのように機能します。 |
| 反結合 (Anti Join) | | 左側のDataFrameから、右側のDataFrameに一致するキーが存在しない行のみを選択します。右側のDataFrameの列は結果に含まれません。 |
| 非等価時間結合 (As-of Join) | | 主に時系列データで使用され、キー列(通常は時間)が完全一致しなくても、指定された許容範囲 (tolerance) や戦略 (strategy: ‘forward’, ‘backward’, ‘nearest’) に基づいて最も近いレコードを結合します。byで追加の完全一致キーを指定できます。 |
| 複数キー/異なるキー名での結合 | | onにリストで複数の列名を指定することで、複数キーでの結合が可能です。左右のDataFrameでキー列名が異なる場合は、left_onとright_onを使用します。 |
| 結合後の列名重複処理 | | 結合キー以外の列名が左右のDataFrameで重複する場合、デフォルトでは右側の列名に_rightという接尾辞が付与されます。suffix引数でこの接尾辞をカスタマイズできます。 |
8. Lazy API
遅延評価API (Lazy API) は、クエリの最適化とメモリ効率の高い処理を可能にします。特に大規模データセットで強力です。
| 目的 | コード例 | 説明 |
|---|---|---|
| LazyFrameの作成 | | scan_*系の関数を使うと、ファイルを直接読み込まずにLazyFrameを作成できます。これにより、メモリに乗り切らないデータも扱えます。既存のEager DataFrameは.lazy()メソッドでLazyFrameに変換できます。 |
| 操作の連鎖 (Chaining) | | LazyFrameに対して行う操作 (filter, with_columns, group_by, agg, sort, limitなど) は、すぐには実行されません。操作は論理的なクエリプランとして記録されます。 |
| 実行計画の表示 | | describe_plan()でユーザーが記述した操作の論理プランを、describe_optimized_plan()でPolarsが最適化(例: Predicate Pushdown, Projection Pushdown, 並列化など)を行った後の実行プランを確認できます。これにより、どのような最適化が行われたかを理解できます。 |
| 計算の実行と結果取得 | | collect()を呼び出すと、記録されたクエリプランが最適化され、計算が実行されます。結果はEager DataFrameとして返されます。fetch(n)は最初のn行だけを計算して返します。sink_*()メソッドは、計算結果をメモリにロードせずに直接ファイルに書き出すため、メモリ使用量を大幅に削減できます (ストリーミング書き込み)。collect(streaming=True) は結果をバッチ処理するためのイテレータを返しますが、まだ実験的な機能です。 |
| Lazy APIのメリット |
| |
9. 式 (Expressions) EXPRESS YOURSELF
Polarsの操作の中心となる「式 (Expression)」は、データに対する変換、計算、条件分岐などを宣言的に記述する方法です。select, with_columns, filter, agg など多くのメソッドで使用されます。
| 式の種類/機能 | コード例 | 説明 |
|---|---|---|
| 列の参照 | | 操作対象の列を指定します。名前、データ型、正規表現で指定できます。 |
| リテラル (定数) | | 固定値を式として扱います。計算や新しい列の作成に使用します。 |
| 算術演算 | | 列やリテラルに対して四則演算や剰余演算を行います。 |
| 比較演算 | | 列やリテラルを比較し、Boolean型のSeriesを返します。filterでよく使用されます。 |
| 論理演算 | | Boolean型の式を組み合わせます。filterやwhen/thenで使用されます。 |
| エイリアス (別名) | | 計算結果や集約結果の列に新しい名前を付けます。with_columnsやaggで必須です。 |
| 条件分岐 (When/Then/Otherwise) | | SQLのCASE WHENに似た条件分岐を実現します。複数のwhen().then()を繋げ、最後にotherwise()でどの条件にも一致しなかった場合の値を指定します。 |
| 集約関数 | | aggメソッド内で使用し、グループ化されたデータまたはDataFrame全体を集約します。 |
| ウィンドウ関数 | | over()と組み合わせて使用し、グループ内での相対的な計算(ランク、累積和、移動平均など)を行います。group_by().agg()とは異なり、元の行数は保持されます。 |
| 型キャスト | | 列のデータ型を変換します。 |
| 名前空間 (str, dt, list, struct) | | 特定のデータ型(文字列、日時、リスト、構造体)に対する操作をまとめたものです。例えば.str.の後に文字列操作メソッドが続きます。 |
10. ユーティリティ
メモリ管理、設定、他ライブラリとの連携など、便利な機能群です。
| 目的 | コード例 | 説明 |
|---|---|---|
| メモリ使用量確認 | | DataFrameが消費しているおおよそのメモリ量を確認します。デバッグやパフォーマンスチューニングに役立ちます。 |
| 設定変更 | | pl.Configを通じて、Polarsの挙動(表示設定、最適化パラメータなど)をカスタマイズします。with pl.Config(...)で一時的な設定変更も可能です。一部設定は環境変数でも制御できます。 |
| NumPy連携 | | to_numpy()でNumPy配列に変換し、pl.from_numpy()やpl.Series()コンストラクタでNumPy配列からPolarsオブジェクトを作成できます。ゼロコピーが可能な場合もあります。 |
| Pandas連携 | | to_pandas()でPandas DataFrameに、pl.from_pandas()でPolars DataFrameに相互変換できます。Arrowフォーマットを介して効率的に変換されます。 |
| Apache Arrow連携 | | Polarsは内部的にArrowメモリフォーマットを使用しているため、to_arrow()とpl.from_arrow()による相互変換は非常に高速で、多くの場合メモリコピーが発生しません (ゼロコピー)。他のArrow対応ライブラリとの連携に便利です。 |
注意:
- バージョン依存: Polarsは活発に開発されており、バージョンによってAPIや挙動が変更される可能性があります。最新のドキュメントを確認することをお勧めします。
- パフォーマンス:
applyやmap_elementsは、Polarsの組み込み関数や式で代替できない場合にのみ使用を検討してください。可能な限り、式ベースの操作を利用することで最高のパフォーマンスが得られます。 - Lazy API推奨: 特にデータサイズが大きい場合や複雑な処理を行う場合は、メモリ効率と最適化の観点からLazy API (
scan_*,.lazy(),collect()/sink_*()) の利用を強く推奨します。