【问题标题】:How to split a json string column in pandas/spark dataframe?如何在 pandas/spark 数据框中拆分 json 字符串列?
【发布时间】:2021-03-03 01:59:23
【问题描述】:

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

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

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

添加我尝试过的sn-p -

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'

【问题讨论】:

  • 分享几行数据。解决方案是使用json_normalize,但没有数据很难向您展示。
  • @SergedeGossondeVarennes 我已经添加了数据和用于拆分数据的 sn-p。你能看一下吗?

标签: python json pandas dictionary


【解决方案1】:

我希望有熊猫经验的人向我展示一个更好的方法,但这就是我想出的。 (我还在学习熊猫。)

import pandas as pd
import json

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)
ser = df['json_result'].apply(lambda s: pd.json_normalize(json.loads(s)))

a = df.drop(columns=['json_result'])
b = pd.concat(list(ser), ignore_index=True)
c = a.join(b)

import sys
c.to_csv(sys.stdout, index=False)

【讨论】:

    【解决方案2】:

    将 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2021-02-27
      • 1970-01-01
      相关资源
      最近更新 更多