解析嵌套的 JSON 并迭代到 Pandas Dataframe

Posted

技术标签:

【中文标题】解析嵌套的 JSON 并迭代到 Pandas Dataframe【英文标题】:Parse nested JSON and iterate into Pandas Dataframe 【发布时间】:2021-10-15 04:29:25 【问题描述】:

我正在使用 Foursquare API 调用来查找与美国特定邮政编码相关的场所。

我能够生成带有信息的 JSON,但是在循环和解析以构建 pandas 数据框时遇到了问题。

到目前为止:

# scraping the foursquare website for the information we want and obtaining the json file as results

for i, series in df_income_zip_good.iterrows():
    lat = series ['lat']
    lng = series ['lng']
    town = series ['place']
    LIMIT = 100
    radius = 1000
    url4Sqr = 'https://api.foursquare.com/v2/venues/explore?&client_id=&client_secret=&v=&ll=,&radius=&limit='.format(
        CLIENT_ID,
        CLIENT_SECRET,
        VERSION,
        lat,
        lng,
        radius,
        LIMIT)

   venues = requests.get(url4Sqr).json()
   #print results from call
   print (venues)
#https://***.com/questions/6386308/http-requests-and-json-parsing-in-python

这可以正常工作并生成 JSON。我已将输出链接到 GitHub 上的 JSON 文件:(https://github.com/adhorvitz/coursera_ibm_capstone/blob/524c6609ea8872e0c188cd373a4778caaadb1cf6/venuedatasample.json)

我不确定如何最好地展平 JSON,然后循环提取我想要加载到数据框中的信息片段。我试图搞砸以下没有成功。

def flatten_json(nested_json, exclude=['']):
    """Flatten json object with nested keys into a single level.
        Args:
            nested_json: A nested json object.
            exclude: Keys to exclude from output.
        Returns:
            The flattened json object if successful, None otherwise.
            The code recursively extracts values out of the object into a flattened dictionary. json_normalize can be applied to the output of flatten_object to produce a python dataframe:
    """
    out = 

    def flatten(x, name='venues', exclude=exclude):
        if type(x) is dict:
            for a in x:
                if a not in exclude: flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x

    flatten(nested_json)
    return out
#https://towardsdatascience.com/flattening-json-objects-in-python-f5343c794b10

然后我运行:

for i in venues():
    json_flat_venues = flatten_json(venues)
    json_flat_venues

产生一个错误,指出“dict”对象不可调用。

我也试过了:

for i in venues():
    df_venues_good = pd.json_normalize(venues)
    df_venues_good

产生同样的错误。

我有点迷失方向,以及如何最好地将 JSON 转换为可行的 DF。

提前致谢。

-------更新-----------

所以我尝试了一些方法。

    在我引用了 cmets 中留下的页面后: https://www.geeksforgeeks.org/flattening-json-objects-in-python/, 我安装了 json_flatten(使用 pop),但在导入时遇到问题 展平。

    作为一种变通方法,我尝试从网站重新创建代码,以适应我的项目。我想我弄得一团糟比我清理的还要多。

    我重新运行了原始的“flatten_json”def(见上文)。然后我在没有 for 循环语句的情况下分配了 df_venues_good(也在上面)。

    删除 for 循环后,它看起来像是开始从 json 中提取第一条记录。但是,它看起来像元数据(或者至少是我不想提取的数据)。

    我在查看 json 时也注意到了一个问题。在我的输出(我使用的是 Jupyter 笔记本)单元格中,看起来所有记录都已检索到(总共大约 95 条)。

然后我运行它只是转储文件进行检查:

JsonString = json.dumps(venues)
JsonFile = open("venuedata.json", "w")
JsonFile.write(JsonString)
JsonFile.close()

当我打开转储文件(我在上面链接的)时,它看起来并不完整。

任何方向都将不胜感激。

【问题讨论】:

这是您要找的东西吗:geeksforgeeks.org/flattening-json-objects-in-python 如果您还有其他问题,请告诉我,这样我就可以尝试为代表点寻找答案 你可以编辑这个问题 更新了您的见解、测试、错误和问题。 把你的代码放到 Github 上分享。我会为你测试它并引导你完成结果。我将向您展示如何使用 print() 测试每一行代码。 【参考方案1】:

经过 4 天的沟通,我想我看到了您提出的真正问题,这将使您继续前进。您需要查找并解决以下两个错误。如果您同意并自行解决更多工作故障,请将我的回答标记为正确,围绕您的见解、错误和围绕以下图片提出的问题创建一个新问题。

您可以用来帮助您“扁平化 Json 数据”的库是 Pandas、requests、Jsons,甚至库 csv 也可以在这里为您提供帮助。

如果您正在学习 python、数据分析以及如何使用 api,那么如果没有更清晰的描述和技术问题示例,您将在 *** 上找到很少甚至没有更多帮助。

请继续自学并继续努力!你得到了这个:)

请让我们知道随着您的成长,社区可以如何帮助解决个别问题和问题:)

【讨论】:

以上是关于解析嵌套的 JSON 并迭代到 Pandas Dataframe的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中提取嵌入为字符串的嵌套 JSON

使用 Python/Pandas 解析嵌套的 JSON

使用 pandas python 将嵌套的 JSON 解析为多个数据帧

使用 Pandas 在巨大的 CSV 中解析带有嵌套值的 JSON 列

使用包含嵌套 JSON 字符串的一列解析 Pandas DataFrame 中的列

使用 Pandas 嵌套 JSON