【问题标题】:How to extract part of a JSON as another JSON and separate them several JSON files on Python如何将 JSON 的一部分提取为另一个 JSON,并在 Python 上将它们分开几个 JSON 文件
【发布时间】:2020-08-01 05:43:15
【问题描述】:

我开始使用 Python 学习数据分析。我一直在尝试将Adzuna dataset 用于我的课程项目。我的 API 调用的响应如下所示:

{
  "results": [
    {
      "salary_min": 50000,
      "longitude": -0.776902,
      "location": {
        "__CLASS__": "Adzuna::API::Response::Location",
        "area": [
          "UK",
          "South East England",
          "Marlow"
        ],
        "display_name": "Marlow, Buckinghamshire"
      },
      "salary_is_predicted": 0,
      "description": "JavaScript Developer Corporate ...",
      "__CLASS__": "Adzuna::API::Response::Job",
      "created": "2013-11-08T18:07:39Z",
      "latitude": 51.571999,
      "redirect_url": "http://adzuna.co.uk/jobs/land/ad/129698749...",
      "title": "Javascript Developer",
      "category": {
        "__CLASS__": "Adzuna::API::Response::Category",
        "label": "IT Jobs",
        "tag": "it-jobs"
      },
      "id": "129698749",
      "salary_max": 55000,
      "company": {
        "__CLASS__": "Adzuna::API::Response::Company",
        "display_name": "Corporate Project Solutions"
      },
      "contract_type": "permanent"
    },
    ... another 19 samples here ...
  ],
  "mean": 43900.46, 
  "__CLASS__": "Adzuna::API::Response::JobSearchResults",
  "count": 74433
}

我的目标是分别在“结果”下提取 20 个样本,以便稍后创建一个 numpy 数据集进行数据分析。所以,我这样写 Python:

item_dict = json.loads(response.text)
# Since "results" start/end with [ and ], Python treats it as a list. So, I need to remove them.
string_data = str(item_dict['results']).lstrip("[")
string_data = string_data.rstrip("]")

# Convert "results" string back to JSON, then extract each sample from 20 samples
json_results_data = json.loads(string_data)
for sample in json_results_data:
  print(sample)

但是,json_results_data = json.loads(string_data) 不能很好地将“结果”字符串转换为 JSON。我是 Python 新手,所以我可能会问一个愚蠢的问题,但如果你能找到一种简单的方法来解决这个问题,请告诉我。谢谢。

【问题讨论】:

  • 如果您使用的是requests,只需执行response.json()。数据应该是一本字典,所以不确定你为什么要进行字符串操作
  • @gold_cy 是的,response.json() 是字典,但如果我写 (responce.json())['results'],这将被视为一个列表,因为它以“[]”开头/结尾,所以我决定删除[] 作为字符串,然后尝试将其转换回 JSON 或字典。 (我说得通吗?)
  • @gold_cy 但你是对的,json.loads(response.text) 应该只是 response.json。我现在就这个问题修改一下。
  • 如果results 是一个列表,只需对其进行迭代以操作其中的对象,不要尝试进行一些字符串操作
  • 它是一个列表,但是每个样本都用,(逗号)分隔,这不是我想要的分隔方式...

标签: python json string pandas list


【解决方案1】:

解决方案

您想要实现的是从 json 对象组织数据。代码中的第一行 item_dict = json.loads(response.text) 返回一个 dict 对象,因此您可以简单地使用它。

我会展示两种方法:

  1. 使用pandas.DataFrame 组织您的数据。
  2. 使用 for 循环仅打印数据。

但请注意,pandas.DataFrame 还允许您快速将数据转换为 numpy 数组(使用:df.to_numpy()

import pandas as pd

results = response.json['results'] # item_dict['results']
df = pd.DataFrame(results)
print(df)
# df.to_numpy()

输出

      a    b     c     d      e
0   1.0  2.0   NaN   dog   True
1  20.0  2.0   0.0   cat   True
2   1.0  NaN   NaN  bird   True
3   NaN  2.0  88.0   pig  False

相反,如果您只想打印出results 中的每个字典,您可以这样做:

for result in results:
    print(result)

虚拟数据

item_dict = {
    'results': [
                {'a': 1, 'b': 2, 'c': None, 'd': 'dog', 'e': True}, 
                {'a': 20, 'b': 2, 'c': 0, 'd': 'cat', 'e': True}, 
                {'a': 1, 'b': None, 'c': None, 'd': 'bird', 'e': True},
                {'a': None, 'b': 2, 'c': 88, 'd': 'pig', 'e': False}
    ],
    "mean": 43900.46, 
    "__CLASS__": "Adzuna::API::Response::JobSearchResults",
    "count": 74433
}

【讨论】:

  • 这里没有指定pandas,所以建议一个像pandas这样的第三方库开销很大的答案,没有意义
  • 感谢您的建议。这次我没有使用 Panda,但这有助于我加深理解
  • @Tak 请试一试,如果您有任何问题,请告诉我。 Pandas 在数据分析方面非常强大,您可以考虑使用它。
  • 我自己尝试了您的解决方案,现在完全可以理解为什么我应该使用pandas 来准备数据分析(我打算使用sklearn)。让我看看哪一个更适合 sklearn 分析,我可能会更改接受刻度...(不确定在 StackOverflow 上更改接受刻度是否合乎道德...)
  • 是的,我实际上决定采用您的解决方案!非常感谢你的帮助。我想我已经投了赞成票?
【解决方案2】:

停止使用方括号......它的意思是一个列表。

试试这个

item_dict = json.loads(response.text)

for sample in item_dict["results"]:
  print(sample)

您的问题是您认为您有一个 dict (json),但您有一个 dicts 列表。

【讨论】:

  • 谢谢。我想我以一种过于复杂的方式解释它......你的解决方案似乎运作良好。请让我再检查一遍!
  • @Tak 没问题。如果对你有帮助,别忘了在我的回答上打勾。
猜你喜欢
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2019-12-09
  • 1970-01-01
  • 2020-10-16
  • 2021-08-13
相关资源
最近更新 更多