Polarsを触ってみる

Python版のTidyverseのようなものらしい。

Python
公開

2025年8月25日

はじめに

先日仕事の用事でRAブートキャンプへ行ってきた。

RAブートキャンプの目的は以下。

社会科学領域の実証研究においてリサーチアシスタント(RA)として携わるための技能を学び、またお互いとの交流を深めることを目的としています。

ここでは経済学をはじめとしたさまざまな分野で実証分析をしている大学学部生・院生が集い、4泊5日でデータの処理や分析方法について学んでいる。

僕自身も2023年度に参加した経験があり、当時は力不足を痛感したものの、そこで得た知識をもとにその後もいろいろ学び、結果としてこのWebサイトを運営するまでに至っている。

ということでもしこれを見ている学生がいたら、是非次年度以降の参加をお勧めしたい。

というのはさておき、ここに参加する方々は皆さん大変豊富な知識を持っているので1、今回も学生オーガナイザーの方から有益な情報を得ることができた(僕が時代遅れなだけの可能性大)。

それはPythonのPolarsというライブラリで、これがbase RとTidyverseのように、Pandasの次世代版のようなものらしい。Quartoドキュメントのレンダリングがめっちゃ速いのも特徴とのこと。

新しい物好きのミーハーな僕としては、是非とも触ってみたいと思い、今回勉強を兼ねてここで概要を見てみることにする。

Polarsとは

とりあえずPolarsの公式ページを覗いてみると、

Polarsは、データ操作のためのオープンソースライブラリであり、単一マシン上で最速のデータ処理ソリューションの一つとして知られています。表現力豊かで使いやすい、構造化された型付きAPIを備えています。

とのこと(Google翻訳済)。

ChatGPTにもPolarsについて説明してもらったところ、

Polarsは、Rust製で高速かつメモリ効率の良い列指向エンジンを持ち、遅延評価や宣言的なチェーン式APIにより、大規模データを直感的かつ効率的に処理できる次世代のデータフレームライブラリです。

らしい。

これだけ見ると速さや効率性が売りなようだが、言葉で説明されてもよくわからないので、とりあえず触ってみたい。

使ってみる

とりあえずインストールから始めよう。

pip install polars

そしたら公式のガイドに載っているサンプルコードをちょっといじって試してみる。

import polars as pl

q = (
    pl.scan_csv("../../../data/iris.csv")
    .filter(pl.col("Sepal.Length") > 5)
    .group_by("Species")
    .agg(pl.all().sum())
)

df = q.collect()

print(df)
shape: (3, 5)
┌────────────┬──────────────┬─────────────┬──────────────┬─────────────┐
│ Species    ┆ Sepal.Length ┆ Sepal.Width ┆ Petal.Length ┆ Petal.Width │
│ ---        ┆ ---          ┆ ---         ┆ ---          ┆ ---         │
│ str        ┆ f64          ┆ f64         ┆ f64          ┆ f64         │
╞════════════╪══════════════╪═════════════╪══════════════╪═════════════╡
│ virginica  ┆ 324.5        ┆ 146.2       ┆ 273.1        ┆ 99.6        │
│ setosa     ┆ 116.9        ┆ 81.7        ┆ 33.2         ┆ 6.1         │
│ versicolor ┆ 281.9        ┆ 131.8       ┆ 202.9        ┆ 63.3        │
└────────────┴──────────────┴─────────────┴──────────────┴─────────────┘

しっかり出力できている。
ちなみにPandas版だとこんな感じ。

import pandas as pd

df = pd.read_csv("../../../data/iris.csv")

df_filtered = df[df["Sepal.Length"] > 5]

df_grouped = df_filtered.groupby("Species").sum(numeric_only=True).reset_index()

print(df_grouped)
      Species  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
0      setosa         116.9         81.7          33.2          6.1
1  versicolor         281.9        131.8         202.9         63.3
2   virginica         324.5        146.2         273.1         99.6

僕はPythonがあまり使えないのでChatGPTにPandas版に変換してもらっただけなのだが、見た感じPolarsの方はRのパイプを使った書き方と似ており、個人的には使いやすそうに感じている。

また、出力結果が見やすくなっているのも特徴だろうか。Rのtibbleのように感じる。

時間もあまりないのでこの程度にしておくが、いろいろと試し甲斐がありそうなので、また時間があるときにでも触ってみたい。

おわりに

今回はそんなものがあるということを綴っただけなので細かい点はまだよくわかっていないが、使えそうな関数も結構あるみたいなので、データハンドリングの際には是非とも使ってみたい。

もう少し知識がたまってきたらtipsの方でも何か書いていこうと思う。

  1. とはいえデータハンドリングの経験がない方も参加できるのでご安心を!↩︎