Python 解析json数组

清理数据时会遇到解析json串的情况,如果只是json串,Python中可通过json包中的loads解析成dict,当遇到json数组时,会稍微麻烦一些。

问题描述

Dataframe格式的数据集中有一列变量,保存的是json数组,需要解析成宽表:

一个ID“小明”,该变量存储的json数组:
[
{‘科目’ : ‘数学’
‘分数’ : ‘80’
‘权重’ : ‘0.5’ },
{‘科目’ : ‘语文’
‘分数’ : ‘70’
‘权重’ : ‘0.3’ },
{‘科目’ : ‘英语’
‘分数’ : ‘90’
‘权重’ : ‘0.2’ }]

解析成:

ID数学语文英语数学权重语文权重英语权重
小明8070900.50.30.2

代码实现

import json

#data['score']为保存的json数组,解析
data['json'] = data['score'].apply(lambda x:json.loads(x))
data['json_len'] = data['json'].apply(lambda x : len(x))

#json.load可以将json串解析成dict,这步操作将json数组转换生包含多个dict的list
type(data['score'][0])
type(data['json'][0][0])
type(data['json'][0])

#查看json串的长度是否一致(比较干净的是一样的长度,不一样的需要确定选取的字段)
data['json_len'].value_counts()

#查看json数组中每个json的结构,确定打开数组的方式
data['json'][0]
data['json'][0][0]
'''
第二步结果为
{'科目' : '数学'
'分数' : '80'
'权重' : '0.5' }
'''

#打开json数组,获得特定变量
def get_json(x):
    y = dict([(i.get('科目'),(i.get('分数'),i.get('权重'))) for i in x])
    return y
        
data['dict'] = data['json'].apply(lambda x:get_json(x))

#分别将变量对应的值生成新的列
varlist = list(data['dict'][0].keys())
for var in varlist:
    data[var] = data['dict'].apply(lambda x:x[var][0])
    data[var + '权重'] = data['dict'].apply(lambda x:x[var][1])

也可以在 hive 中用 LATERAL VIEW 和 get_json_array 一起解析。
(奇怪我的代码怎么不是彩色的)

参考链接:
https://blog.csdn.net/august1226/article/details/81561934
https://blog.csdn.net/djz19890117/article/details/79165281

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值