快速将 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】:我认为您可以先将string
列data
转换为dict
,然后通过values
创建list
的numpy 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 日期
如何将此嵌套的 JSON 以柱状形式转换为 Pandas 数据框