初めに
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)
となります。