【Python】Elasticsearchから取得したデータをデータフレームとして扱う

前回は、PythonからElasticsearchのデータを取得する方法を紹介しました。

ElasticsearchのAPIを使用すると、JSON形式でデータを取得します。

一方、Pythonでデータ分析等を行う際は、Pandasのデータフレーム形式の方が扱いやすいです。

そこで今回は、Elasticsearchから取得したデータを、Pandasのデータフレームに変換するまでの処理を紹介していきたいと思います。

Elasticsearchからデータを取得する

Elasticsearchへの接続からデータ取得は、以下のようにしました。

from elasticsearch import Elasticsearch

#接続
es = Elasticsearch("http://localhost:9200")

#インデックスからデータ取得
SearchResult = es.search(index="boston", size=1000)
result = SearchResult["hits"]["hits"]

この辺の細かいことについては、以下の記事に書いています。

取得したデータをデータフレームに変換する

変数resultの中身をデータフレームに変換していきます。

resultは、辞書型データの配列になっています。目当てのデータは、配列の各要素の”_source”に格納されています。

resultの中身
resultの中身
データの格納場所
各要素の”_source”にデータが格納されている

なので、for文で各要素の”_source”を取り出し、1つのデータフレームとして結合していくのが得策です。

import pandas as pd

#空のデータフレーム作成
df = pd.DataFrame()

#1行ずつデータを追加
for record in result:
  #JSON形式をデータフレームに変換
    df_record = pd.json_normalize(record["_source"])
    df = df.append(df_record)
    
df = df.reset_index(drop=True)

“_source”は辞書型なので、pandasのjson_normalize()を使ってデータフレームに変換します。

こうすることで、以下のようなデータフレームを作成することができます。

最後の1行は、インデックスの再振り付けをしています。

コード全文

Elasticsearch接続からデータフレーム作成までのソースコードは以下の通りです。

from elasticsearch import Elasticsearch
import pandas as pd

#接続
es = Elasticsearch("http://localhost:9200")

#インデックスからデータ取得
SearchResult = es.search(index="boston", size=1000)
result = SearchResult["hits"]["hits"]

#空のデータフレーム作成
df = pd.DataFrame()

#1行ずつデータを追加
for record in result:
  #JSON形式をデータフレームに変換
    df_record = pd.json_normalize(record["_source"])
    df = df.append(df_record)
    
df = df.reset_index(drop=True)

まとめ

PythonでElasticsearchからデータを取得したら、pandasを使ってデータ分析をするケースも少なくないのではないでしょうか。

ネストのデータ構造なのでやや複雑な感じもしますが、原理がわかれば応用も効くので、是非参考にしてみてください!

ではでは👋