我有一个大的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 |
+---------+--------+---------------+--------+---------------+
答案 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
上看到此信息