[小ネタ]polarsのread_csvで全ての列を文字列型として読み込む方法

2023.11.28

データアナリティクス事業本部のueharaです。

今回は、polarsのread_csvで全ての列を文字列型として読み込む方法をご紹介したいと思います。

結論

read_csvの引数 infer_schema_lengthの値を 0 にすることで、全ての列を文字列型として読み込むことができます。

df = pl.read_csv("data.csv", infer_schema_length=0)

infer_schema_length は「スキーマを推測するために読み取る最大行数」のことです(デフォルトは100)。

infer_schema_length について、polarsの公式ドキュメントには以下の記載があります。

If set to 0, all columns will be read as pl.Utf8.

上記より、 0 を設定すればpl.Utf8、すなわち文字列として読み取れることが分かります。

やってみた

以下のデータとPythonのスクリプトを用意します。

data.csv

data1,data2,data3
1,1.123,aaa
2,2.234,bbb
3,3.345,ccc

test.py

import polars as pl

df = pl.read_csv("data.csv")
print(df.dtypes)

実行結果は次の通りです。

$ python test.py
[Int64, Float64, Utf8]

左から順に整数、浮動小数、文字列として判定されていることが分かります。

では、今度は冒頭で述べた通り infer_schema_length=0 を設定してみます。

test2.py

import polars as pl

df = pl.read_csv("data.csv", infer_schema_length=0)
print(df.dtypes)

実行結果は次の通りです。

$ python test2.py
[Utf8, Utf8, Utf8]

全て文字列として判定されていることが分かります。

ここで、次のようなデータを用意します。

data.csv

data1,data2
0,123456789123456789123456789
1,123456789123456789123456789
2,123456789123456789123456789

これを普通に読み込もうとすると、以下のエラーが発生します。

$ python test.py
(省略)
polars.exceptions.ComputeError: Could not parse `123456789123456789123456789` as dtype `i64` at column 'data2' (column number 2).

すなわち、123456789123456789123456789を整数型として判定しているのですが、pl.Int64に収まる値になっていないためエラーが発生しています。

仮にread_csvにて infer_schema_length=0 を設定した場合は、全て文字列として判定されるため、本エラーは発生しません。

$ python test2.py
[Utf8, Utf8]

最後に

今回は、polarsのread_csvで全ての列を文字列型として読み込む方法をご紹介してみました。

参考になりましたら幸いです。

参考文献