1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PolarsAdvent Calendar 2024

Day 6

Polarsのインデックス参照

Last updated at Posted at 2024-12-05

pandasのインデックス参照はかなり複雑です。

参考:pandasの基礎知識

Polarsもインデックス参照が使えます。そこそこ複雑ですが、pandasよりはわかりやすいでしょう。

本記事では、PolarsのDataFrameのインデックス参照を簡単に紹介します。

概要

DataFrameをインデックス参照すると、要素、Series、DataFrameのいずれかを取得できます。

行の指定にはキーとしてintなどを、列の指定にはキーとしてstrなどを使います。
行の指定と列の指定のどちらかは省略できます。

下記のDataFrameを使って確認しましょう。

In

df = pl.DataFrame({
    "Name": ["Alice", "Bob"],
    "Age": [30, 20],
})
df

Out

shape: (2, 2)

Name Age
str i64
"Alice" 30
"Bob" 20

行指定が「intかintのスライスかintのリスト」、列指定がなし

行指定が「intかintのスライスかintのリスト」で、列指定がない場合は、指定した行(DataFrame)になります。

In

df[0]

Out

shape: (1, 2)

Name Age
str i64
"Alice" 30

In

df[1:]

Out

shape: (1, 2)

Name Age
str i64
"Bob" 20

In

df[[1]]

Out

shape: (1, 2)

Name Age
str i64
"Bob" 20

行指定がなし、列指定がstr

行指定がなく、列指定がstrの場合は、指定した列(Series)になります。

In

df["Name"]

Out

shape: (2,)

Name
str
"Alice"
"Bob"

行指定がなし、列指定が「strのスライスかstrのリスト」

行指定がなく、列指定が「strのスライスかstrのリスト」の場合は、指定した列(DataFrame)になります。

In

df["Name":]

Out

shape: (2, 2)

Name Age
str i64
"Alice" 30
"Bob" 20

In

df[["Name"]]

Out

shape: (2, 1)

Name
str
"Alice"
"Bob"

行指定がint、列指定がstrかint

行指定がintで、列指定がstrかintの場合は、指定した行と列の要素になります。

In

df[0, "Name"]

Out

'Alice'

また、代入の左辺に使えます。

※ 要素が数字や文字列などの単純な型でないと代入でエラーになることがあるようです。

行指定が「intのスライスかintのリスト」、列指定がstrかint

行指定が「intのスライスかintのリスト」で、列指定がstrかintの場合は、指定した行の列(Series)になります。

In

df[1:, "Name"]

Out

shape: (1,)

Name
str
"Bob"

行指定が「intかintのスライスかintのリスト」、列指定が「strかintのスライス、または、strかintのリスト」

行指定が「intかintのスライスかintのリスト」で、列指定が「strのスライスかstrのリスト」の場合は、指定した行と指定した列(DataFrame)になります。

In

df[1, :"Name"]

Out

shape: (1, 1)

Name
str
"Bob"

まとめ

行指定 列指定 代入
intかintのスライスかintのリスト なし DataFrame ×
なし str Series ×
なし strのスライスかstrのリスト DataFrame ×
int strかint 要素
intのスライスかintのリスト strかint Series ×
intかintのスライスかintのリスト strかintのスライス、
または、strかintのリスト
DataFrame ×
  • 行指定には、intかintのスライスかintのリスト
  • 列指定には、strかstrのスライスかstrのリスト
    • ただし、第2キーのときはstrの代わりにintが可能
  • 行指定なしは全行指定、列指定なしは全列指定とみなす
  • 1行、1列の場合の値は、要素(代入可能)
  • 複数行、1列の場合の値は、Series
  • 複数列の場合の値は、DataFrame

感想

列の取得は、df.get_column("Name")df.to_series(0)のように書けます。当初は、このような書き方の方が好ましいと考えてましたが、インデックス参照を使っても問題ないように考えるようになりました。
理由は、以下のようなものです。

  • pandasのインデックス参照はわかりにくかったが、Polarsは無理なく覚えられる
  • シンプルで柔軟に記述できる

また、エクスプレッションの方がふさわしい場合は、エクスプレッションも積極的に使っていくつもりです。

以上

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?