PandasとPolarsのメソッド比較対応まとめ一覧【Python】

データ操作

スポンサーリンク

Pandasは遅い、ということで昨今様々な代替案が出てきていますが、今回はPandasをPolarsで書き換えるとどうなるかをまとめてみました。

概要

Pandasと比較して、Polarsはパフォーマンスに優れ、大規模データの処理に特化しているのが大きな特徴です。
また、Polarsは遅延評価を利用しており、効率的なメモリ使用が可能です。

ビッグデータを扱う際には脱Pandasを進める場合が多いため、Polarsに書き換える際に何度も参照できるよう簡潔にまとめています。

データ構造

Pandas

  • DataFrame: 二次元のラベル付きデータ構造。
  • Series: 一次元のラベル付きデータ構造。

Polars

  • DataFrame: Pandasと同様の二次元データ構造。
  • Series: PandasのSeriesに相当する一次元データ構造。

データの作成

Pandas

import pandas as pd

pd.DataFrame(data)  # データからDataFrameを作成
pd.Series(data)     # データからSeriesを作成
pd.concat(objs)     # 複数のDataFrameを縦または横に結合
pd.Series.from_dict(dictionary)  # 辞書からSeriesを作成

Polars

import polars as pl

pl.DataFrame(data)  # データからDataFrameを作成
pl.Series(name, data)  # 名前付きデータからSeriesを作成
pl.concat([df1, df2])  # 複数のDataFrameを結合
pl.from_dict(dictionary)  # 辞書からDataFrameを作成

データの読み込み

Pandas

pd.read_csv(filepath)  # CSVファイルを読み込む
pd.read_excel(filepath) # Excelファイルを読み込む
pd.read_json(filepath)  # JSONファイルを読み込む
pd.read_sql(query, connection)  # SQLクエリを実行してデータを読み込む
pd.read_parquet(filepath)  # Parquetファイルを読み込む

Polars

pl.read_csv(filepath)  # CSVファイルを読み込む
pl.read_parquet(filepath)  # Parquetファイルを読み込む
pl.read_json(filepath)  # JSONファイルを読み込む
pl.read_sql(query, connection)  # SQLクエリを実行してデータを読み込む

データの操作

列の選択

Pandas

df['column']             # 単一の列を選択
df[['col1', 'col2']]     # 複数の列を選択
df.loc[]                 # ラベルベースのインデクシング
df.iloc[]                # 整数インデクシング
df.filter(items=['col1', 'col2'])  # 特定の列を選択

Polars

df['column']             # 単一の列を選択
df.select(['col1', 'col2'])  # 複数の列を選択
df.slice(start, length)  # 特定の範囲の行を選択

行のフィルタリング

Pandas

df[df['column'] > value]  # 条件に基づいて行をフィルタリング
df.query('column > value') # クエリ文字列を使ったフィルタリング

Polars

df.filter(pl.col('column') > value)  # 条件に基づいて行をフィルタリング
df.filter(pl.col('column').is_not_null())  # NULLでない行を選択

新しい列の追加

Pandas

df['new_column'] = value  # 新しい列を追加
df.assign(new_column=value)  # assignメソッドを使って新しい列を追加

Polars

df.with_column(pl.lit(value).alias('new_column'))  # 新しい列を追加
df.with_columns(pl.col('column') * 2)  # 既存の列を基に新しい列を追加

列の削除

Pandas

df.drop('column', axis=1)  # 特定の列を削除
df.drop(columns=['col1', 'col2'])  # 複数の列を削除

Polars

df.drop('column')  # 特定の列を削除
df.drop(['col1', 'col2'])  # 複数の列を削除

集約操作

Pandas

df.groupby('column').agg({'agg_col': 'sum'})  # グループ化と集約
df.groupby('column').mean()  # 平均を計算

Polars

df.groupby('column').agg(pl.col('agg_col').sum())  # グループ化と集約
df.groupby('column').agg([pl.col('agg_col').mean()])  # 平均を計算

統計量の計算

Pandas

df.mean()            # 平均を計算
df.std()             # 標準偏差を計算
df.median()          # 中央値を計算
df.describe()        # 基本的な統計量を取得
df.corr()            # 相関行列を計算
df.cov()             # 共分散行列を計算

Polars

df.mean()            # 平均を計算
df.std()             # 標準偏差を計算
df.median()          # 中央値を計算
df.describe()        # 基本的な統計量を取得
df.corr()            # 相関行列を計算
df.cov()             # 共分散行列を計算

データの並べ替え

Pandas

df.sort_values(by='column')  # 特定の列を基に並べ替え
df.sort_index()              # インデックスで並べ替え

Polars

df.sort('column')            # 特定の列を基に並べ替え
df.sort(by='column', reverse=True)  # 特定の列で逆順に並べ替え

データの結合

Pandas

pd.merge(df1, df2, on='key')  # データフレームをキーで結合
pd.concat([df1, df2])          # 複数のDataFrameを結合
df.join(other)                 # 他のDataFrameをインデックスで結合

Polars

df1.join(df2, on='key')        # データフレームをキーで結合
pl.concat([df1, df2])          # 複数のDataFrameを結合
df1.vstack(df2)                # 縦に結合

インデックスの操作

Pandas

df.set_index('column')           # 特定の列をインデックスに設定
df.reset_index()                 # インデックスをリセット
df.set_index(['col1', 'col2'])   # 複数の列をインデックスに設定

Polars

  • インデックスの概念はなく、列に基づいて操作を行う。

欠損値の処理

Pandas

df.fillna(value)                # 欠損値を特定の値で埋める
df.dropna()                     # 欠損値を含む行を削除
df.isna()                       # 欠損値の有無を確認

Polars

df.fill_null(value)             # 欠損値を特定の値で埋める
df.drop_nulls()                 # 欠損値を含む行を削除
df.is_null()                    # NULLの有無を確認

データ型の変換

Pandas

df['column'].astype('type')      # 列のデータ型を変換
df.convert_dtypes()              # データフレーム全体のデータ型を自動的に変換

Polars

df.with_column(pl.col('column').cast('type'))  # 列のデータ型を変換

データの入れ替え

Pandas

df.rename(columns={'old_name': 'new_name'})  # 列名を変更
df.rename_axis('new_name', axis='index')      # インデックス名を変更

Polars

df.rename({'old_name': 'new_name'})  # 列名を変更

ピボットとクロス集計

Pandas

pd.pivot_table(df, values='value', index='index_col', columns='column_col', aggfunc='mean')  # ピボットテーブルの作成
pd.crosstab(df['row_col'], df['column_col'])  # クロス集計

Polars

df.pivot(index='index_col', columns='column_col', values='value')  # ピボットテーブルの作成
df.groupby('row_col').agg(pl.col('column_col').count())  # クロス集計の代替

時系列データの処理

Pandas

pd.to_datetime(df['date'])  # 日付列をdatetime型に変換
df.resample('M').sum()       # 月単位でデータを集約
df.shift()                   # 行をシフト

Polars

pl.col('date').dt.strptime('%Y-%m-%d')  # 日付列をdatetime型に変換
df.groupby_dynamic('date', every='1mo').agg(pl.sum('value'))  # 月単位でデータを集約

その他の機能

Pandas

df.apply(func)  # 各行または各列に関数を適用
df.pipe(func)   # データフレームをパイプラインで処理

Polars

df.apply(func)  # 各行または各列に関数を適用
df.pipe(func)   # データフレームをパイプラインで処理

以上です。
追加や訂正があれば適宜更新にて対応いたします。