将JSON列快速转换为Pandas数据帧

时间:2016-12-18 15:14:27

标签: python json pandas

我正在从数据库(50k +行)读取数据,其中一列存储为JSON。我想把它提取到一个pandas数据帧中。 下面的代码片段工作正常,但是相当低效,并且在对整个数据库运行时真的需要永远。 请注意,并非所有项都具有相同的属性,并且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

3 个答案:

答案 0 :(得分:8)

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'])

答案 1 :(得分:7)

我认为您可以先将stringdata转换为dict,然后按values和{{}} list创建numpy arrays 3}}:

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))

答案 2 :(得分:0)

  

data = {“事件”:[
        {
           “ timemillis”:1563467463580,            “ date”:“ 18.7.2019”,            “ time”:“ 18:31:03,580”,            “ name”:“播放器正在加载”,            “数据”:””         },         {
           “ timemillis”:1563467463668,            “ date”:“ 18.7.2019”,            “ time”:“ 18:31:03,668”,            “ name”:“播放器已加载”,            “数据”:“ 5”         }]}

from pandas.io.json import json_normalize
result = json_normalize(data,'events')
print(result)