如何解析Pandas DataFrame中的嵌套JSON字符串列并提取指定字段
解析DataFrame中的嵌套JSON字符串,生成结构化多列表
我来帮你搞定这个嵌套JSON解析的问题!针对你给出的DataFrame结构,我们可以一步步把嵌套的cost和monthly字段提取出来,最终得到你想要的清晰结构。下面是具体的实现步骤和代码:
1. 准备示例数据(补全你的原始数据)
首先我们先把你给出的示例DataFrame补全,确保每个JSON字符串包含我们需要的name、costs和monthly字段:
import pandas as pd import json d = { 'id': ['10001', '10002'], 'json': [ '{"name": "frank", "costs": [{"cost": 15.85}], "monthly": 15.85}', '{"name": "mary", "costs": [{"cost": 30.86}], "monthly": 23.03}' ] } df = pd.DataFrame(d)
2. 解析JSON列并展开成结构化数据
我们先把JSON字符串转换成Python字典,再用pd.json_normalize把字典展开成单独的列:
# 将json字符串列解析为字典 df['json_dict'] = df['json'].apply(json.loads) # 把字典列展开成结构化的DataFrame json_expanded = pd.json_normalize(df['json_dict'])
3. 提取嵌套的cost字段并合并数据
因为costs是一个数组(即使只有一个元素),我们需要从数组中取出第一个元素的cost值,然后把原DataFrame的id列和展开后的列合并,最后筛选出我们需要的列:
# 合并原DataFrame的id列和展开后的JSON数据 combined_df = pd.concat([df[['id']], json_expanded], axis=1) # 从costs数组中提取cost值,处理数组为空的边界情况 combined_df['cost'] = combined_df['costs'].apply(lambda x: x[0]['cost'] if x else None) # 筛选出最终需要的列 final_df = combined_df[['id', 'name', 'cost', 'monthly']]
4. 查看最终结果
运行print(final_df)就能得到你想要的结构:
id name cost monthly 0 10001 frank 15.85 15.85 1 10002 mary 30.86 23.03
简化版一步到位代码
如果你不想用中间变量,也可以把步骤合并成一行:
final_df = pd.concat([ df[['id']], pd.json_normalize(df['json'].apply(json.loads)) ], axis=1).assign( cost=lambda x: x['costs'].apply(lambda y: y[0]['cost'] if y else None) )[['id', 'name', 'cost', 'monthly']]
注意事项
- 如果你的
costs数组可能有多个元素,需要根据需求调整提取逻辑(比如取总和、平均值,或者展开成多行) - 上面的代码已经处理了
costs数组为空的情况,此时cost会返回None
内容的提问来源于stack exchange,提问作者PokerFace
相关产品推荐
相关产品推荐

