【问题标题】:MongoDB nested JSONs to Pandas DF/CSVMongoDB 将 JSON 嵌套到 Pandas DF/CSV
【发布时间】:2018-09-24 00:51:19
【问题描述】:

我有一个大型 Mongo DB 文档,每行一个 JSON 文档。我需要将其转换为柱状格式(Pandas DF 或 CSV),以便能够分析和得出相同的见解。我没有足够的经验来解析 Mongo DB,我不确定我是否做对了。

到目前为止我做了什么: 为了能够使用 json.loads,我在每行的末尾添加了一个逗号,并将大量的内容包装到 [] 中。

示例(1 个 JSON 的一部分)如下所示:

{ "id" : "12345id" , "price" : 202.4, "order_id" : "bc2341" , "order_time" : { "date" : "2018-03-27T12:22:50.935+0000" }, "work_data" : { "worker_id" : "5938686", "job" : [ { "id" : "663442", "approx_time" : "2018-03-27T12:13:58.33Z", "job_type" : null }, { "id" : "663442", "approx_time" : "2018-03-27T12:13:58.33Z", "job_type" : null }]}

我已将此代码写入 CSV:

 report_file = open('..result.csv', 'w')
 writer = csv.writer(report_file)
 for row in config_file:
    jobs = row.get('work_data',{}).get('job',{})
    jobs_str = ''
    if isinstance(jobs, list):
        for job in jobs:
            jobs_str += job.get('approx_time', '')
    writer.writerow((row['order_time']['date'], jobs_str))
    report_file.close

它有效,但我不知道如何将多个作业拆分为不同的列以获得不同的 approx_time。有人可以帮忙解决吗? 也许有更好的方法将 JSON 从 MongoDB 转换为 CSV/Pandas?

最后我需要这样的东西:

每 1 个 JSON 1 行,如果 JSON 中有多个作业,则它们必须在列中

+---------+--------+---------------+--------+---------------+ | id |id_job_1| approx_time_1 |id_job_2| approx_time_2 | +---------+--------+---------------+--------+---------------+ | 12345id | 664442 | 27.03.2018 | 663442 | 27.03.2018 | | 22345id | 633442 | 27.03.2018 | 622442 | 27.03.2018 | +---------+--------+---------------+--------+---------------+

【问题讨论】:

  • 不确定您在这里的确切含义:“如何将多个作业拆分为不同的列以获得不同的 approx_time”。你想达到什么目的?你需要平均'approx_time'吗?只是所有“大约时间”的列表?

标签: python json mongodb pandas


【解决方案1】:

也许首先让您的输入更接近所需的格式。你研究过 MongoDB 导出函数吗? This 在 SO 中,documentation

另外,在处理文件时,最好使用context managers

如果您需要每个 job 有一个 CSV 行,您应该在 job 循环中包含您的 writter.writerow

更新

在您创建的 CSV 中,您应该将所有标准信息放在第一列,并在它们的末尾附加所有额外的作业。 当您在 Pandas 中加载 CSV 时,您将在 Job # 上获得该行不存在的带有 NaN 的行。例如:

id_1, job_1_id, job_2_id,
id_2, job_1_id, NaN

在上面的示例中,第 1 行有 2 个工作,第 2 行有 1 个工作。你可以在这个post看到这个

【讨论】:

  • 每个全局 ID 需要一个 CSV 行(示例为 1 行)。它必须是 ID、Price、Order_id 等所有列。还有 2 个作业 ID、2 个作业 approx_time 和 2 个作业类型(或更多作业,在某些行中,作业数超过 2 个)
  • @AlekseyVinokurov 你现在可能已经解决了这个问题,但是为你的问题添加了一个可能的解决方案
猜你喜欢
  • 2021-06-28
  • 2020-10-17
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2022-11-23
  • 2021-02-02
  • 2021-01-09
  • 2021-02-03
相关资源
最近更新 更多