LoginSignup
1
7

More than 1 year has passed since last update.

PandasからPolarsに乗り換えるときに対応した変更点

Posted at

初めに

PolarsというDataFrameライブラリが速くて話題になっているということで、Pandasの既存資産への変更点をまとめました。

準備

pip install numpy pandas polars
import polars as pl
import pandas as pd
import numpy as np

pandas.DataFrame

pddf = pd.DataFrame(
    {
        "a": np.arange(0, 5),
        "b": np.arange(10, 15),
        "c": np.arange(20, 25),
    }
)
   a   b   c
0  0  10  20
1  1  11  21
2  2  12  22
3  3  13  23
4  4  14  24

polars.DataFrame

pldf = pl.DataFrame(
    {
        "a": np.arange(0, 5),
        "b": np.arange(10, 15),
        "c": np.arange(20, 25),
    }
)
shape: (5, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i32 ┆ i32 ┆ i32 │
╞═════╪═════╪═════╡
│ 0   ┆ 10  ┆ 20  │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 1   ┆ 11  ┆ 21  │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ 12  ┆ 22  │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ 13  ┆ 23  │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 4   ┆ 14  ┆ 24  │
└─────┴─────┴─────┘

動作を比較

末尾からn番目の行を抽出

pddf.iloc[-2, :]
a     3
b    13
c    23
Name: 3, dtype: int32

行を抽出した場合、pandas.DataFrame の場合はpandas.Seriesとして取得されます。

pldf[-2, :]
Traceback (most recent call last):
  File "_test_polars.py", line 34, in <module>
    main()
  File "_test_polars.py", line 30, in main
    print(pldf[-2, :])
  File "C:\Python38\lib\site-packages\polars\internals\dataframe\frame.py", line 1333, in __getitem__
    return df.slice(row_selection, 1)
  File "C:\Python38\lib\site-packages\polars\internals\dataframe\frame.py", line 2827, in slice
    return self._from_pydf(self._df.slice(offset, length))
OverflowError: can't convert negative int to unsigned

polars.DataFrameの場合はエラーとなってしまいます。

pldf[-2:-1, :]
shape: (1, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i32 ┆ i32 ┆ i32 │
╞═════╪═════╪═════╡
│ 3   ┆ 13  ┆ 23  │
└─────┴─────┴─────┘

範囲抽出の場合は負の値を指定しても動くので、1行だけ抽出したい場合でも範囲指定する必要があります。
抽出結果はpolars.Seriesではなくpolars.DataFrameになり、この違いが次項で述べるnumpy.ndarrayの変換に影響してきます。

行抽出結果を 'numpy.ndarray' へ変換

pddf.iloc[-2, :].values
[ 3 13 23]

pandas.Seriesnumpy.ndarrayへ変換した場合はshape=(n,)になります。

pldf[-2:-1, :].to_numpy()
[[ 3 13 23]]

しかし、polars.DataFrameの場合は行の抽出結果もpolars.DataFrameであるため、numpy.ndarrayへの変換結果はshape=(1,n)となります。

1
7
0

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
7