清理数据时会遇到解析json串的情况,如果只是json串,Python中可通过json包中的loads解析成dict,当遇到json数组时,会稍微麻烦一些。
问题描述
Dataframe格式的数据集中有一列变量,保存的是json数组,需要解析成宽表:
一个ID“小明”,该变量存储的json数组:
[
{‘科目’ : ‘数学’
‘分数’ : ‘80’
‘权重’ : ‘0.5’ },
{‘科目’ : ‘语文’
‘分数’ : ‘70’
‘权重’ : ‘0.3’ },
{‘科目’ : ‘英语’
‘分数’ : ‘90’
‘权重’ : ‘0.2’ }]
解析成:
ID | 数学 | 语文 | 英语 | 数学权重 | 语文权重 | 英语权重 |
---|---|---|---|---|---|---|
小明 | 80 | 70 | 90 | 0.5 | 0.3 | 0.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