python - 将复杂的 JSON 导出为 CSV
问题描述
我有一个从 API 下载的 JSON 文件。目前,我已经能够将其导出为 JSON 并通过 Excel Power Query 准确解析数据。
数据按 Campaign IDS 划分(在本例中,只有两个),然后,按所选时间段的每一天,有几个不同的指标相关联。例如,这些是一些(不完整的)行,供您查看它应该如何工作。
campaignId metadata.id metrics.impressions metrics.clicks
s00821idk 2019-05-19 12000293121 100
s00821idk 2019-05-18 12300223151 103
我尝试使用 Excel 来解析这些数据,这违背了使用 API 的目的。因为我是从 Python 导出的,所以通过 Excel 运行它,然后将它放在 Google Sheet 中。
我想在 Python 中进行所有转换,以便我可以使用 Google Sheets API 并将其放置在那里。
在以下链接中,我提供了导出的 JSON 文件。 文件
如果你能帮助我以这种方式构建数据,我会很高兴。太感谢了。
解决方案
如前所述,您需要完全展平多个嵌套值,迭代以获得您想要的。它可以完成,但它非常大(每个广告系列 id 有 24,000 多列),因此需要 2 分钟来遍历您提供的整个内容。
import json
import pandas as pd
import re
with open('C:/data.json') as f:
jsonObj = json.load(f)
def flatten_json(y):
out = {}
def flatten(x, name=''):
if type(x) is dict:
for a in x:
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(y)
return out
flat = flatten_json(jsonObj)
results = pd.DataFrame()
special_cols = []
columns_list = list(flat.keys())
for item in columns_list:
try:
row_idx = re.findall(r'\_(\d+)\_', item )[0]
except:
special_cols.append(item)
continue
column = re.findall(r'\_\d+\_(.*)', item )[0]
column = column.replace('_', '')
row_idx = int(row_idx)
value = flat[item]
results.loc[row_idx, column] = value
for item in special_cols:
results[item] = flat[item]
results.to_csv('file.csv', index=False)
输出:
print (results)
campaignId ... totalCampaigns
0 0081da282b2dbe8140508074366cac91ba ... 2
1 00c03d801da285767a093d0b4d5188fb34 ... 2
[2 rows x 24533 columns]
推荐阅读
- sorting - 在 Google 电子表格中同时按列排序和过滤的更简单替代方法
- python - TypeError: unhashable type: 'list' 当找到一个产品的组成
- printing - 打印预览中CKeditor中缺少背景颜色
- pandas - 熊猫子图上的多个图
- html - 如何修复图像下推文本?
- mysql - MYSQL 从同一个表中选择并连接多个 where AND 子句
- javascript - 十进制-二进制 (JavaScript) 项目
- python - Python网页抓取多个页面只有一个静态链接
- java - JAVA中的MySQL表名注入
- python - 两个通配符之间的python正则表达式匹配