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

Posted

技术标签:

【中文标题】快速将 JSON 列转换为 Pandas 数据框【英文标题】:Fast convert JSON column into Pandas dataframe 【发布时间】:2017-05-03 17:56:44 【问题描述】:

我正在从一列存储为 JSON 的数据库(50k+ 行)中读取数据。我想将其提取到熊猫数据框中。 下面的 sn-p 工作正常,但效率相当低,并且在针对整个数据库运行时确实需要很长时间。 请注意,并非所有项目都具有相同的属性,并且 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

【问题讨论】:

df.data.apply(lambda x: pd.Series(json.loads(x))) 会做吗? 您能否以不同的(任何一种标准)格式存储您粘贴的数据? @JohnGalt: 有效,但这不会使字典变平 @MaxU:如果可能的话,我宁愿不更改抓取脚本 【参考方案1】:

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

【讨论】:

谢谢。这比您的第一个解决方案要快;) 我收到此错误:'DataFrame' 对象没有属性'data' @AliMirzaei 将其替换为您自己的列名。 如果您的答案和 Madhur Yadav 结合起来,以便包含一个示例,那就太好了。【参考方案2】:

我认为您可以先将stringdata 转换为dict,然后通过values 创建listnumpy arrays 和最后一个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))

另一个想法:

 df = pd.json_normalize(df['data'])

【讨论】:

谢谢 - 这比我最初的方法快 100 倍。唯一的问题是这不会扩展嵌套的字典。这可能吗? 检查另一个答案 ;) 快速问题@jezrael csv 的顺序和您从变量“a”制作的 df 是一样的吗?第一条记录将是第一条记录,第二条将是第二条记录,依此类推.. 他们会洗牌吗? @skybunk - 是的,完全正确。没有理由shuffle【参考方案3】:

数据 = “事件”:[ “timemillis”:1563467463580, “日期”:“18.7.2019”, "时间":"18:31:03,580", "name":"播放器正在加载", “数据”:”” , “timemillis”:1563467463668, “日期”:“18.7.2019”, "时间":"18:31:03,668", "name":"播放器已加载", “数据”:“5” ]

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

【讨论】:

以上是关于快速将 JSON 列转换为 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期

如何将 pandas 列中的 JSON 数据转换为新列

如何将此嵌套的 JSON 以柱状形式转换为 Pandas 数据框

无法将 JSON 转换为 pandas。所有数据都包含在一行中。我该如何解压它?

将 pandas df 转换为 json 然后解析日期

如何自动将csv转换为pandas?