如何在df中使用json_normalize()函数对特定字段进行规范化,并保留其他列?
如何在df中使用json_normalize()函数对特定字段进行规范化,并保留其他列?
这是一个简单的例子(我的实际数据集中的json字段非常嵌套,所以我一次解开一层)。我需要在json_normalize()之后保留数据集上的某些列。
开始:
[图片链接]
期望的(Excel模拟):
[图片链接]
实际情况:
[图片链接]
import json d = {'report_id': [100, 101, 102], 'start_date': ["2021-03-12", "2021-04-22", "2021-05-02"], 'report_json': ['{"name":"John", "age":30, "disease":"A-Pox"}', '{"name":"Mary", "age":22, "disease":"B-Pox"}', '{"name":"Karen", "age":42, "disease":"C-Pox"}']} df = pd.DataFrame(data=d) display(df) df = pd.json_normalize(df['report_json'].apply(json.loads), max_level=0, meta=['report_id', 'start_date']) display(df)
根据json_normalize()的文档,我认为meta参数是我需要保留report_id和start_date的参数,但是似乎没有起作用,期望保留的字段没有出现在最终的数据集中。
有人可以给予建议吗?谢谢。
问题出现的原因是用户想要将DataFrame中的特定字段进行json_normalize()处理,并保留其他列。解决方法是使用join()函数沿着轴进行连接,并使用drop()函数删除原始的json字段。
用户可以根据数据的不同形式选择使用literal_eval()函数或json.loads()函数来处理字符串化的json对象。使用literal_eval()函数时,需要使用map()函数将其应用于DataFrame中的每个元素。使用json.loads()函数时,直接传递json字符串给它即可。
下面是解决问题的示例代码:
from ast import literal_eval df.join( pd.json_normalize(df['report_json'].map(literal_eval)) ).drop('report_json', axis=1)
以上代码将DataFrame中的'report_json'列进行json_normalize()处理,并使用join()函数将处理后的结果与原始DataFrame连接起来。最后使用drop()函数删除原始的'report_json'列。
如果使用json.loads()函数,代码如下:
import json df.join( pd.json_normalize(df['report_json'].map(json.loads)) ).drop('report_json', axis=1)
以上代码将DataFrame中的'report_json'列进行json_normalize()处理,并使用join()函数将处理后的结果与原始DataFrame连接起来。最后使用drop()函数删除原始的'report_json'列。
这样就能够实现对特定字段进行json_normalize()处理,并保留其他列的需求。