首页 > 解决方案 > 如何在 pandas/spark 数据框中拆分 json 字符串列?

问题描述

我的原始数据框具有以下列-

在此处输入图像描述

我想将json_result列拆分为单独的列,如下所示:

在此处输入图像描述

我尝试使用 json_normalise,但无法应用于整个数据帧。有人可以分享代码来转换整个数据框吗?

添加我尝试过的片段 -

raw_data = [{'id': 1, 'name': 'NATALIE', 'json_result': '{"0": {"_source": {"person_id": 101, "firstname": "NATALIE", "lastname": "OSHO", "city_name": "WESTON"}}}'}, \
        {'id': 2, 'name': 'MARK', 'json_result': '{"0": {"_source": {"person_id": 102, "firstname": "MARK", "lastname": "BROWN", "city_name": "NEW YORK"}}}'}, \
        {'id': 3, 'name': 'NANCY', 'json_result': '{"0": {"_source": {"person_id": 103, "firstname": "NANCY", "lastname": "GATES", "city_name": "LA"}}}'}]

df = pd.DataFrame.from_dict(raw_data)

splitted_df = pd.json_normalize(df['json_result'][0])

错误信息:

AttributeError:“str”对象没有属性“values”

标签: pythonjsonpandasdictionary

解决方案


将 json 转换为列的 Spark 版本。

raw_data = \
    [{'id': 1, 'name': 'NATALIE', 'json_result': '{"0": {"_source": {"person_id": 101, "firstname": "NATALIE", "lastname": "OSHO", "city_name": "WESTON"}}}'}, \
     {'id': 2, 'name': 'MARK', 'json_result': '{"0": {"_source": {"person_id": 102, "firstname": "MARK", "lastname": "BROWN", "city_name": "NEW YORK"}}}'}, \
     {'id': 3, 'name': 'NANCY', 'json_result': '{"0": {"_source": {"person_id": 103, "firstname": "NANCY", "lastname": "GATES", "city_name": "LA"}}}'}]
df = spark.createDataFrame(raw_data)
json_schema = spark.read.json(df.rdd.map(lambda rec: rec.json_result)).schema
df = df.withColumn('json', F.from_json(F.col('json_result'), json_schema)) \
    .select("id", "name", "json.0._source.*")
df.show()

推荐阅读