您好,我正在寻找一种有效的方法来标准化包含 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' 列的规范化值,并为原始数据框中的每一行重复其他列。
这个代码片段做的是:
-
将 JSON 字符串转换为 Python 字典:
它使用
apply
和eval
将 'document_anatomy__cr' 列中的字符串转换为实际的 Python 字典。 - 提取 'data' 字段: 它从现在已经是字典的 'document_anatomy__cr' 列中提取 'data' 字段。
-
使用
json_normalize
规范化 'data' 列: 它使用json_normalize
函数将 'data' 列中的嵌套 JSON 结构扩展到单独的列中。 -
展开规范化的数据:
它使用
explode
将 'id' 和 'value' 列表扩展到单独的行中。 -
与原始数据框连接:
它使用
concat
将规范化的数据与原始数据框连接起来,有效地复制了原始数据框中的其他列的值。
这应该提供了一种避免显式循环并有效处理大型数据集的方法。
标签:python,json,pandas,dataframe From: 78800011