MongoDB将JSON嵌套到Pandas DF / CSV

时间:2018-04-13 15:44:30

标签: python json mongodb pandas

我有一个大的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

它有效,但我无法弄清楚如何将多个作业分成不同的列以获得不同的大约时间。有人可以帮忙解决这个问题吗? 也许有更好的方法将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 | +---------+--------+---------------+--------+---------------+

1 个答案:

答案 0 :(得分:0)

也许首先让您的输入更接近所需的格式。你有没有调查MongoDB导出功能? This在SO中,documentation

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

如果您需要为每个job设置一个CSV行,则应该在writter.writerow循环内设置job

<强>更新

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

id_1, job_1_id, job_2_id,
id_2, job_1_id, NaN

在上面的示例中,第1行有2个作业,第2行有1个作业。您可以在此post

上看到此信息