1つの列がJSONとして格納されているデータベース(5万行以上)からデータを読み取っています。これをpandasデータフレームに抽出したいと思います。以下のスニペットは正常に機能しますが、かなり効率が悪く、db全体に対して実行すると本当に時間がかかります。すべてのアイテムが同じ属性を持っているわけではなく、 JSONにいくつかのネストされた属性があること。
どうすればこれを速くできますか?
import pandas as pd
import json
df = pd.read_csv('http://Pastebin.com/raw/7L86m9R2', \
header=None, index_col=0, names=['data'])
df.data.apply(json.loads) \
.apply(pd.io.json.json_normalize)\
.pipe(lambda x: pd.concat(x.values))
###this returns a dataframe where each JSON key is a column
json_normalize は、処理済みのjson文字列またはpandasそのような文字列のシリーズを受け取ります。
pd.io.json.json_normalize(df.data.apply(json.loads))
設定
import pandas as pd
import json
df = pd.read_csv('http://Pastebin.com/raw/7L86m9R2', \
header=None, index_col=0, names=['data'])
最初にstring
列data
をdict
に変換し、次にlist
of numpy arrays
を values
および最後 DataFrame.from_records
:
df = pd.read_csv('http://Pastebin.com/raw/7L86m9R2', \
header=None, index_col=0, names=['data'])
a = df.data.apply(json.loads).values.tolist()
print (pd.DataFrame.from_records(a))
データ= {「イベント」:[
{
"timemillis":1563467463580、 "date": "18.7.2019"、 "time": "18:31:03,580"、 "name": "プレーヤーがロード中"、 "data": ""} 、{
"timemillis":1563467463668、 "date": "18.7.2019"、 "time": "18:31:03,668"、 "name": "プレーヤーが読み込まれました"、 "data": "5" }]}
from pandas.io.json import json_normalize
result = json_normalize(data,'events')
print(result)