python - 如何迭代 json 输出并在数据框中获得理想的结果?
问题描述
我正在连接 API 并尝试获取数据。以 JSON 格式提取的数据,但我想将其转换为具有某些记录的数据框。请你帮助我好吗?
例子:
queue_id = 'a72dba75-0bc6-4a65-b120-8803364f8dc3'
queryResult: {'results': [{'data': [{'interval': '2021-10-11T11:46:25.000Z/2021-10-12T11:46:25.000Z',
'metrics': [{'metric': 'nOffered',
'qualifier': None,
'stats': {'count': 1,
'count_negative': None,
'count_positive': None,
'current': None,
'denominator': None,
'max': None,
'min': None,
'numerator': None,
'ratio': None,
'sum': None,
'target': None}}],
'views': None},
{'interval': '2021-10-13T11:46:25.000Z/2021-10-14T11:46:25.000Z',
'metrics': [{'metric': 'nOffered',
'qualifier': None,
'stats': {'count': 2,
'count_negative': None,
'count_positive': None,
'current': None,
'denominator': None,
'max': None,
'min': None,
'numerator': None,
'ratio': None,
'sum': None,
'target': None}}],
'views': None},
{'interval': '2021-10-14T11:46:25.000Z/2021-10-15T11:46:25.000Z',
'metrics': [{'metric': 'nOffered',
'qualifier': None,
'stats': {'count': 3,
'count_negative': None,
'count_positive': None,
'current': None,
'denominator': None,
'max': None,
'min': None,
'numerator': None,
'ratio': None,
'sum': None,
'target': None}}],
'views': None},
{'interval': '2021-10-15T11:46:25.000Z/2021-10-16T11:46:25.000Z',
'metrics': [{'metric': 'nOffered',
'qualifier': None,
'stats': {'count': 1,
'count_negative': None,
'count_positive': None,
'current': None,
'denominator': None,
'max': None,
'min': None,
'numerator': None,
'ratio': None,
'sum': None,
'target': None}}],
'views': None}],
'group': {'mediaType': 'voice',
'queueId': '73643cff-799b-41ae-9a67-efcf5e593155'}}]}
我想在数据框中得到以下格式-
queue_id nOffered_count nOffered_sum interval_start interval_end
0 a72dba75-0bc6-4a65-b120-8803364f8dc3 6 None 2021-10-11T11:46:25.000Z 2021-10-12T11:46:25.000Z
1 a72dba75-0bc6-4a65-b120-8803364f8dc3 1 None 2021-10-12T11:46:25.000Z 2021-10-13T11:46:25.000Z
2 a72dba75-0bc6-4a65-b120-8803364f8dc3 12 None 2021-10-13T11:46:25.000Z 2021-10-14T11:46:25.000Z
3 a72dba75-0bc6-4a65-b120-8803364f8dc3 6 None 2021-10-14T11:46:25.000Z 2021-10-15T11:46:25.000Z
4 a72dba75-0bc6-4a65-b120-8803364f8dc3 6 None 2021-10-15T11:46:25.000Z 2021-10-16T11:46:25.000Z
nOffered_sum
&nOffered_count
列名就像 - metric_sum
&metric_count
我尝试了下面的代码,但没有给出正确的结果 -
column_names = []
final_data_lst = []
if(query_result.results != None):
for item in query_result.results:
data_lst = []
for lst_data in item.data:
print("####################################")
print(lst_data)
print("####################################")
for met in lst_data.metrics:
metric_name = met.metric
column_names.append('Queue_Id')
column_names.append(metric_name+'_count')
column_names.append(metric_name+'_sum')
column_names.append('Interval Start')
column_names.append('Interval End')
data_lst.append(queue_id)
data_lst.append(met.stats.count)
data_lst.append(met.stats.sum)
data_lst.append(lst_data.interval.split('/')[0])
data_lst.append(lst_data.interval.split('/')[1])
解决方案
根据需要使用列名的方法之一:
import pandas
from collections import defaultdict
queue_id = 'a72dba75-0bc6-4a65-b120-8803364f8dc3'
out = defaultdict(list)
for data in queryResult['results']:
for d in data.get('data'):
out['queue_id'].append(queue_id)
for metric in d.get('metrics'):
out[metric['metric']+"_count"].append(metric['stats']['count'])
out[metric['metric']+"_sum"].append(metric['stats']['sum'])
interval = d['interval'].split('/')
out['interval_start'].append(interval[0])
out['interval_end'].append(interval[1])
df = pandas.DataFrame(out)
print (df)
推荐阅读
- c++ - 在 C++ 中拥有多个指向单个对象的指针的正确方法是什么?
- javascript - 使用 for 循环运行异步函数是一种好习惯吗?
- outlook - 如果 Outlook/yahoo 服务器不支持 IMAP CONDSTORE,那么从上次检查中获取标志更改的替代方法是什么
- c - 从文件中读取行时,偶尔会触发分段错误/不正确的校验和
- google-cloud-platform - 如何将本地数据工作流迁移到 Google Cloud?
- python-3.x - pytorch中的类型不匹配
- postgresql - 将列乘以一的不同值
- unix - 如何记录我的 SFTP 命令的输出
- mysql - 从另一个表中选择每个组和关联行的最高值,按最高值排序
- ios - SwiftUI DatePicker 绑定可选日期,有效 nil