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) # データフレームをパイプラインで処理
以上です。
追加や訂正があれば適宜更新にて対応いたします。
ディスカッション
コメント一覧
まだ、コメントがありません