概要
polarsが早いと噂なので(遅すぎるが)移行したいので自分用メモ。
参考
環境
- google colaboratory
sample
データ入出力
csv読み込み
import polars as pl
df = pl.read_csv("iris.csv")
- csv読み込みはpandasと同様
- オプションのキーワードが違うので注意
csv出力
df.write_csv("iris2.csv")
- csv出力は
write_csv
を使用する- pandasの場合は
to_csv
- pandasの場合は
データ可視化
先頭、末尾
df.head()
df.tail()
- デフォルトで5行出力
サマリー
df.describe()
""" 出力サンプル
describe sepal_length sepal_width petal_length petal_width species
str f64 f64 f64 f64 str
"count" 150.0 150.0 150.0 150.0 "150"
"null_count" 0.0 0.0 0.0 0.0 "0"
"mean" 5.843333 3.054 3.758667 1.198667 null
"std" 0.828066 0.433594 1.76442 0.763161 null
"min" 4.3 2.0 1.0 0.1 "setosa"
"max" 7.9 4.4 6.9 2.5 "virginica"
"median" 5.8 3.0 4.35 1.3 null
"25%" 5.1 2.8 1.6 0.3 null
"75%" 6.4 3.3 5.1 1.8 null
"""
- describeも同様に使用できる
- null_countが見えるのが偉い
データフレームに対する処理
フィルタリング処理(pandasと使い勝手が大きく違うので注意)
例: irisデータセットからsepal_lengthが7cm以上の行を抽出する
df.filter(7 <= pl.col("sepal_length"))
- polarsでは条件を満たす行の抽出には
filter
を使う- filterの引数にEXPRESSIONを渡す
- pandasみたいに
df[df["sepal_length"] > 7]
と書けない
列の追加(pandasと使い勝手が大きく違うので注意)
例: irisデータセットからsepal_lengthのサイズに応じて["S", "M", "L"]のラベルを新たな列を作成し付与する
# applyを使用する場合
df.with_columns(
df["sepal_length"].apply(lambda x: "S" if x < 5 else ("M" if x < 7 else "L")).alias("SML")
)
# EXPRESSIONを使う場合
df.with_columns(
pl.when(pl.col("sepal_length") < 5).then("S")
.when(pl.col("sepal_length") < 7).then("M")
.otherwise("L")
.alias("SML")
)
- 列の追加には
with_columns
を使用する- applyはpandas同様に使用できる
- expressionを使うことも可能
- 追加する列のcolumn名は
alias
で指定する
データフレームのソート
例:sepal_length
で降順にソート後sepal_width
で昇順にソートする
df.sort(["sepal_length", "sepal_width"], descending=[True, False])
- pandasのsort_valuesとほぼ同じ
- オプションの向きが違うので注意(pandasは
ascending
)
- オプションの向きが違うので注意(pandasは
遅延評価(pandasと使い勝手が大きく違うので注意)
# csv読み出しの時から遅延評価する
df = (
pl.scan_csv("iris.csv")
.filter(5 <= pl.col("sepal_length"))
.with_columns((pl.col("sepal_length") / pl.col("sepal_width")).alias("sepal_ratio"))
.groupby("species").agg(
[
pl.col("sepal_length", "sepal_width", "sepal_ratio").mean().suffix("_mean")
]
)
.collect()
)
# 特定の処理を遅延評価する
df = (
df
.lazy()
.filter(5 <= pl.col("sepal_length"))
.with_columns((pl.col("sepal_length") / pl.col("sepal_width")).alias("sepal_ratio"))
.groupby("species").agg(
[
pl.col("sepal_length", "sepal_width", "sepal_ratio").mean().suffix("_mean")
]
)
.collect()
)
- pandasにない概念
-
scan_csv()
~collect()
で挟んだ箇所はpolarsが最適化してまとめて実行する - 公式は遅延評価を推奨している