首页 > 编程问答 >使用 json 列规范化 Dataframe

使用 json 列规范化 Dataframe

时间:2024-07-30 14:38:17浏览次数:8  
标签:python json pandas dataframe

您好,我正在寻找一种有效的方法来标准化包含 json 数据列的数据框。 我从保存为数据帧的网站获取 json 响应。 结构如下所示

在此处输入图像描述

我有 3 个标准列,第 4 列包含我想要规范化的 json 数据,并创建使用前 3 列中的值复制每行的行以及拆分的行第四列。

如下所示 在此处输入图像描述

我想避免循环遍历数据帧的每一行,因为有超过 20k 行,可能需要一段时间。

有人可以指出我吗正确的方向。 我相信第一个挑战是从第四列中剥离或删除不需要的数据 例如 {'responseDetails': {'pagesize': 250, 'pageoffset': 0, 'size': 8, 'total': 8}, 这样我就可以将 json 列规范化为数据帧。

我尝试将列转换为 json,并且可以获取数据,但我必须使用 for 循环迭代超过 20k 条记录。

split_col = df['document_anatomy__cr'].to_json(orient="records")
y = json.loads(split_col)
print(y[0]['data'])

你可以用 pandas 库来实现这个目标,而不需要显式循环。特别的是, json_normalize 函数可以帮助你将 JSON 数据扩展到单独的列中。

这是一个如何做到这一点的例子:

import pandas as pd

# 示例数据框
df = pd.DataFrame({
    'column1': ['A', 'B', 'C'],
    'column2': [1, 2, 3],
    'column3': [True, False, True],
    'document_anatomy__cr': [
        "{'responseDetails': {'pagesize': 250, 'pageoffset': 0, 'size': 8, 'total': 8}, 'data': [{'id': 1, 'value': 'x'}, {'id': 2, 'value': 'y'}]}",
        "{'responseDetails': {'pagesize': 250, 'pageoffset': 0, 'size': 5, 'total': 5}, 'data': [{'id': 3, 'value': 'z'}]}",
        "{'responseDetails': {'pagesize': 250, 'pageoffset': 0, 'size': 3, 'total': 3}, 'data': [{'id': 4, 'value': 'w'}, {'id': 5, 'value': 'v'}]}"
    ]
})

# 1. 将 JSON 字符串转换为 Python 字典
df['document_anatomy__cr'] = df['document_anatomy__cr'].apply(eval)

# 2. 从 'document_anatomy__cr' 列中提取 'data' 字段
df['data'] = df['document_anatomy__cr'].apply(lambda x: x['data'])

# 3. 使用 json_normalize 将 'data' 列规范化
df_normalized = pd.json_normalize(df['data'])

# 4. 将规范化的数据展开到单独的行中
df_normalized = df_normalized.explode('id').reset_index(drop=True)
df_normalized = df_normalized.explode('value').reset_index(drop=True)

# 5. 与原始数据框连接
df = df.drop(['document_anatomy__cr', 'data'], axis=1)
df_final = pd.concat([df, df_normalized], axis=1)

print(df_final)

这将为你提供一个新的数据框,其中包含来自 JSON 数据的 'id' 和 'value' 列的规范化值,并为原始数据框中的每一行重复其他列。

这个代码片段做的是:

  1. 将 JSON 字符串转换为 Python 字典: 它使用 apply eval 将 'document_anatomy__cr' 列中的字符串转换为实际的 Python 字典。
  2. 提取 'data' 字段: 它从现在已经是字典的 'document_anatomy__cr' 列中提取 'data' 字段。
  3. 使用 json_normalize 规范化 'data' 列: 它使用 json_normalize 函数将 'data' 列中的嵌套 JSON 结构扩展到单独的列中。
  4. 展开规范化的数据: 它使用 explode 将 'id' 和 'value' 列表扩展到单独的行中。
  5. 与原始数据框连接: 它使用 concat 将规范化的数据与原始数据框连接起来,有效地复制了原始数据框中的其他列的值。

这应该提供了一种避免显式循环并有效处理大型数据集的方法。

标签:python,json,pandas,dataframe
From: 78800011

相关文章

  • 如何让 python 类型在需要父类时将子类识别为有效类型?
    这是我需要做的一个最小示例:fromtypingimportCallable,AnyclassData:passclassSpecificData(Data):passclassEvent:passclassSpecificEvent(Event):passdefdetect_specific_event(data:SpecificData,other_info:str)->Specif......
  • 使用 Python + Beautiful Soup 抓取任何包含 5 个数字的字符串
    我住在德国,那里的邮政编码在大多数情况下都是5位数字。53525。我真的很想使用beautifulSoup从网站中提取该信息。我是Python/BeautifulSoup的新手,我不知道如何将“查找连续的每5个数字+“空格””翻译成Python语言。importrequestsimporturllib.re......
  • 如何测试 python 类型协议是另一个协议的子类?
    该问题的明显解决方案是使用issubclass,但这会引发TypeError(使用Python3.6.7),例如>>>fromtyping_extensionsimportProtocol>>>classProtoSubclass(Protocol):...pass...>>>issubclass(ProtoSubclass,Protocol)Traceback(mos......
  • Python:指定与继承一起使用的类方法的返回类型
    我一直在尝试了解如何在Python中指定类方法的返回类型,以便即使对于子类也能正确解释它(例如在我的Sphinx文档中)。假设我有:classParent:@classmethoddefa_class_method(cls)->'Parent':returncls()classChild(Parent):pass什么如......
  • python使用SMTP功能发送邮件
    网页格式发送for_email.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>h1{color:brown;}p{margin:5px;color:purple......
  • python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(
    文章目录前言1、列表、字典生成式2、递归函数2.1python中代码的递归深度(扩展)3、拓展:迭代器和生成器3.1迭代器(iter)3.2生成器(yield)4、匿名函数(lambda)4.1map函数4.2reduce函数(较少使用)4.3filter函数前言本文主要讲解一些简化代码格式的一些方法,方便大家更好的......
  • Python:在 Protocol 和 TypedDict 之间共享类型注释
    举这个简单的例子:from__future__importannotationsimporttypingastclassMyType:def__init__(self,s:str,i:int)->None:self.s=sself.i=iclassMyProto(t.Protocol):s:stri:intclassMyDict(t.TypedDict):......
  • PIL 和 python 静态类型
    我有一个函数参数,它可以接受图像的多种类型:defsomefunc(img:Union[np.array,Image,Path,str]):PILImage在这种情况下抛出以下异常:TypeError:Union[arg,...]:eachargmustbeatype.Got<module'PIL.Image'from...进一步检查图像对象后这才有......
  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......