初めに
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.Seriesをnumpy.ndarrayへ変換した場合はshape=(n,)になります。
pldf[-2:-1, :].to_numpy()
[[ 3 13 23]]
しかし、polars.DataFrameの場合は行の抽出結果もpolars.DataFrameであるため、numpy.ndarrayへの変換結果はshape=(1,n)となります。