Pandas如何处理DataFrame中的JSON列提取键值生成简单字典
解决方案
不需要提前固定属性键名,直接逐行遍历properties列的嵌套字典,提取每个属性对应的value字段即可,代码如下:
# 处理为字典格式的简化属性 df['properties'] = df['properties'].apply( lambda prop_map: {attr_name: attr_detail['value'] for attr_name, attr_detail in prop_map.items()} )
如果需要和示例效果一致,存储为标准JSON字符串格式,追加json序列化步骤:
import json df['properties'] = df['properties'].apply( lambda prop_map: json.dumps( {attr_name: attr_detail['value'] for attr_name, attr_detail in prop_map.items()}, ensure_ascii=False ) )
逻辑说明
- 代码通过字典推导式自动遍历每行
properties字典的所有顶层键,不管属性名是动态生成的什么内容,都能自动适配 - 仅提取每个属性嵌套结构中
value字段的内容,自动丢弃timestamp、source、versions等不需要的元数据 - 处理后输出结果和预期完全匹配:
id isDeleted properties 0 1 False {"taxa": "1,49%", "num_associated": "1"} 1 2 False {"num_associated": "1", "time_available": "12313", "createdate": "1612285284796"}
容错与扩展
- 若存在部分属性缺失
value字段的异常数据,可将attr_detail['value']替换为attr_detail.get('value'),避免触发KeyError,缺失值会自动填充为None - 若需要把提取出的属性直接展开为DataFrame的独立列,可使用如下代码:
# 提取简化属性后直接展开为多列 simplified_props = df['properties'].apply( lambda prop_map: {attr_name: attr_detail['value'] for attr_name, attr_detail in prop_map.items()} ) df = df.join(pd.json_normalize(simplified_props)).drop(columns=['properties'])
内容的提问来源于stack exchange,提问作者Renan Nogueira
相关产品推荐
相关产品推荐

