Skip to content

PolarsでJSONデータを処理する方法: クイックガイド

JSONデータをプロのように処理することを夢見ていますか?ようこそお越しくださいました!今日は、特にJSONデータの処理に重点を置いたPythonとRustのスーパーチャージされたDataFrameライブラリ、Polarsを探求します。その火を噴くようなパフォーマンスと使いやすいメソッドを備えたPolarsが、データサイエンティストの世界中で選ばれる理由をご覧いただけます。

PolarsでJSON文字列カラムをdictに変換する方法

しばしば、カラムにJSON文字列を含むDataFrameに遭遇することがあります。このDataFrameを、JSON文字列内の特定のキーまたは値に基づいてフィルタリングしたいとします。最も堅牢な処理方法は、JSON文字列を辞書に変換することです。ただし、Polarsでは一般的な辞書では動作しません。代わりに、辞書の各キーがstructの「フィールド名」にマップされ、対応する辞書の値がこのフィールドの値となる「structs」という概念を使用します。

しかし、一つだけ困ったことに、structの型を作成するには2つの制約があります:

  1. すべての構造体には同じフィールド名が必要です。
  2. フィールド名は同じ順序でリストされる必要があります。

しかし、心配しないでください!Polarsはjson_path_matchという、JSONPath構文に基づいて値を抽出する関数を提供しています。これにより、キーが存在するかどうかを確認し、その値を取得できます。以下はその方法です:

import polars as pl
 
json_list = [
    """{"name": "Maria", "position": "developer", "office": "Seattle"}""",
    """{"name": "Josh", "position": "analyst", "termination_date": "2020-01-01"}""",
    """{"name": "Jorge", "position": "architect", "office": "", "manager_st_dt": "2020-01-01"}""",
]
 
df = pl.DataFrame(
    {
        "tags": json_list,
    }
).with_row_count("id", 1)
 
df = df.with_columns([
    pl.col('tags').str.json_path_match(r"$.name").alias('name'),
    pl.col('tags').str.json_path_match(r"$.office").alias('location'),
    pl.col('tags').str.json_path_match(r"$.manager_st_dt").alias('manager start date'),
])

上記の例では、JSON文字列を含む「tags」という名前の列を持つDataFrameを作成しました。次に、json_path_match関数を使用して特定の値を抽出します。これらの値は、DataFrameの新しい列(「name」、「location」、「manager start date」)に割り当てられます。

キーが見つからない場合、json_path_matchはnullを返します。この事実を利用して、特定のキーの存在に基づいてDataFrameをフィルタリングできます。

df = df.filter(pl.col('tags').str.json_path_match(r"$.manager_st_dt").is_not_null())

上記のコード行では、JSON文字列内に「manager_st_dt」キーが存在する行だけを含むDataFrameにフィルタリングしています。

Polarsで大きなJSONファイルをDataFrameとして読み取る方法

大規模JSONファイルを扱う場合、次のエラーが発生することがあります。「RuntimeError: BindingsError: "ComputeError(Owned(\"InvalidEOF\"))"」。このエラーの原因はいくつかありますが、最も一般的な原因の1つは、PolarsがJSONファイルの最初の1000行からスキーマを推論し、その後ファイルの別のスキーマに遭遇することです。これは通常、最初の1000行には存在しなかった追加のキーを持つエントリがあるためです。

このような状況を処理するには、Polarsにファイルを読み込むときに特定のスキーマを使用するように指示するか、Polarsにスキーマを推論するためにファイルをすべてスキャンすることができます。後者のオプションは時間がかかることがありますが、大きなファイルの場合、「InvalidEOF」エラーを防止することができます。

df = pl.read_json("large_file.json", infer_schema_length=None)

「infer_schema_length」を「None」に設定することで、Polarsはスキーマを推論するためにファイル全体をスキャンするように強制されます。この操作はより時間がかかる場合がありますが、Polarsがファイル全体のスキーマを正確に認識できるようになり、エラーの可能性を排除できます。

これらの技術により、JSONデータ処理タスクを効果的に実行することができます。JSON文字列から大規模JSONファイルまで、PolarsでのJSONデータ処理には新しい可能性が広がります。

PyGWalkerでPolarsのデータフレームを可視化する

PyGWalker (opens in a new tab)は、Polarsのデータフレームから簡単にデータ可視化を作成するのに役立つオープンソースのPythonライブラリです。

PyGWalker for Data visualization (opens in a new tab)

Pythonのコーディングで複雑な処理を完了する必要はなくなりました。データをインポートして、変数をドラッグアンドドロップしてあらゆる種類のデータ可視化を作成できます。ここでは動作のクイックデモビデオをご覧いただけます。


Jupyter NotebookでPyGWalkerを使用する方法は次のとおりです。

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

または、Kaggle Notebook/Google Colabで試してみることもできます。

Kaggle NotebookでPyGWalkerを実行 (opens in a new tab)Google ColabでPyGWalkerを実行 (opens in a new tab)PyGWalkerに⭐️を付ける (opens in a new tab)
Kaggle NotebookでPyGWalkerを実行 (opens in a new tab)Google ColabでPyGWalkerを実行 (opens in a new tab)PyGWalkerに⭐️を付ける (opens in a new tab)

PyGWalkerは、オープンソースのコミュニティのサポートによって構築されています。 PyGWalker GitHub (opens in a new tab)をチェックして、スターを付けてください!

よくある質問

PolarsでJSONデータを処理する際に関連する質問の中でよくあるものをいくつか紹介します。

Q: PolarsでJSON文字列を辞書に変換する必要がある理由は何ですか?
A: PolarsはPythonの辞書を直接扱うことはできません。代わりに、 'structs'という概念を使用します。 JSON文字列をstructsに変換すると、これらのJSON文字列内の特定のキーまたは値に基づいて操作を実行することができます。

Q: 「read_json」関数の「infer_schema_length」パラメータは何をしますか?
A: 「infer_schema_length」パラメータは、Polarsがスキーマを推論するためにJSONファイルの最初のどの部分からスキャンするかを定義します。 Noneに設定すると、Polarsはファイル全体をスキャンし、より包括的なスキーマ理解を示しますが、ロード時間が長くなります。

Q: 「json_path_match」関数を使用する場合、キーが見つからなかった場合はどうなりますか?
A: 「json_path_match」関数がキーを見つけられない場合、nullが返されます。この動作は、特定のキーの存在または不在に基づいてデータをフィルタリングするために使用できます。