【问题标题】:Iterate over json result and get the desirable data in pandas dataframe遍历 json 结果并在 pandas 数据框中获取所需的数据
【发布时间】:2021-12-07 06:47:00
【问题描述】:

我有一个 json 结果,我试图将其转换为数据框,但无法获得正确的结果。实际上在某些情况下它是正确的,但在某些情况下它是失败的。

例子:

基于度量 API 正在为指定的时间间隔生成结果。但这并不确定特定的间隔度量是否有输出。并且进程正在运行 4 个不同的 queue_id。

假设进程仅针对 2 个指标运行。 ['nOffered', 'nTransferred']

queue_id = 'a72dba75-0bc6-4a65-b120-8803364f8dc3' 对于这个 queue_id,nOffered 有一些值,但 nTransferred 没有。 Json 结果如下-

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

但是,当进程为第二个 queue_id 运行时,它不工作- queue_id - 73643cff-799b-41ae-9a67-efcf5e593155

此 queue_id 的 json 输出 -

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}},
                                    {'metric': 'nTransferred',
                                     '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-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,Interval Start,Interval End,nOffered_count,nOffered_sum,nOffered.denominator,nOffered.numerator,nTransferred_count,nTransferred_sum,nTransferred.denominator,nTransferred.numerator
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-11T11:46:25.000Z,2021-10-12T11:46:25.000Z,1,,,,,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-13T11:46:25.000Z,2021-10-14T11:46:25.000Z,2,,,,1,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-14T11:46:25.000Z,2021-10-15T11:46:25.000Z,3,,,,,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-15T11:46:25.000Z,2021-10-16T11:46:25.000Z,1,,,,,,,

在最终结果中,结果合并并给出所有列和数据的输出。

Queue_Id,Interval Start,Interval End,nOffered_count,nOffered_sum,nOffered.denominator,nOffered.numerator,nTransferred_count,nTransferred_sum,nTransferred.denominator,nTransferred.numerator
a72dba75-0bc6-4a65-b120-8803364f8dc3,2021-10-11T11:46:25.000Z,2021-10-12T11:46:25.000Z,6,,,,,,,
a72dba75-0bc6-4a65-b120-8803364f8dc3,2021-10-12T11:46:25.000Z,2021-10-13T11:46:25.000Z,1.0,,,,,,,
a72dba75-0bc6-4a65-b120-8803364f8dc3,2021-10-13T11:46:25.000Z,2021-10-14T11:46:25.000Z,12.0,,,,,,,
a72dba75-0bc6-4a65-b120-8803364f8dc3,2021-10-14T11:46:25.000Z,2021-10-15T11:46:25.000Z,6.0,,,,,,,
a72dba75-0bc6-4a65-b120-8803364f8dc3,2021-10-15T11:46:25.000Z,2021-10-16T11:46:25.000Z,6.0,,,,,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-11T11:46:25.000Z,2021-10-12T11:46:25.000Z,1,,,,,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-13T11:46:25.000Z,2021-10-14T11:46:25.000Z,2,,,,1.0,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-14T11:46:25.000Z,2021-10-15T11:46:25.000Z,3,,,,,,,
73643cff-799b-41ae-9a67-efcf5e593155,2021-10-15T11:46:25.000Z,2021-10-16T11:46:25.000Z,1,,,,,,,

目前我在逻辑下运行-

        out = defaultdict(list)
        
        if(query_result.results != None):
            for item in query_result.results:
                #data_lst = []
                for lst_data in item.data:
                    print("####################################")
                    print(lst_data)
                    print("####################################")
                    
                    out['queue_id'].append(queue_id)

                    for met in lst_data.metrics:
                        out[met.metric+"_count"].append(met.stats.count)
                        out[met.metric+"_sum"].append(met.stats.sum)
                        out[met.metric+".denominator"].append(met.stats.denominator)
                        out[met.metric+".numerator"].append(met.stats.numerator)
                    interval = lst_data.interval.split('/')
                    out['Interval Start'].append(interval[0])
                    out['Interval End'].append(interval[1])
                    print("out", out)
        else:
            metric_name = query.metrics[0]
            out['queue_id'].append(queue_id)
            out[metric_name+"_count"].append('')
            out[metric_name+"_sum"].append('')
            out[metric_name+".denominator"].append('')
            out[metric_name+".numerator"].append('')
            interval = query.interval.split('/')
            out['Interval Start'].append(interval[0])
            out['Interval End'].append(interval[1])

        print(out)
        df = pd.DataFrame(out)
        print (df)
        return df

【问题讨论】:

  • 您能添加您的代码吗? (stackoverflow.com/help/minimal-reproducible-example)。
  • @ndclt 嗨,我也添加了我的代码。
  • 请建议我在我的代码中需要更改的内容。
  • 给定的代码不起作用。至少有两个未定义变量queryqueue_id

标签: python json python-3.x pandas dataframe


【解决方案1】:

我使用以下逻辑来获得理想的结果。它对我有用。

        lst_of_metrics = ["nOffered", "nTransferred"]
        out = defaultdict(list)
        
        if(query_result.results != None):
            for item in query_result.results:
                #data_lst = []
                for lst_data in item.data:
                    print("####################################")
                    print(lst_data)
                    print("####################################")
                    
                    out['queue_id'].append(queue_id)
                    for met1, met in itertools.zip_longest(query.metrics, lst_data.metrics):
                        if(met):
                            if(met.metric == met1):
                                out[met.metric+"_count"].append(met.stats.count)
                                out[met.metric+"_sum"].append(met.stats.sum)
                                out[met.metric+".denominator"].append(met.stats.denominator)
                                out[met.metric+".numerator"].append(met.stats.numerator)
                            else:
                                out[met1+"_count"].append('')
                                out[met1+"_sum"].append('')
                                out[met1+".denominator"].append('')
                                out[met1+".numerator"].append('')
                        else:
                            out[met1+"_count"].append('')
                            out[met1+"_sum"].append('')
                            out[met1+".denominator"].append('')
                            out[met1+".numerator"].append('')
                        
                    interval = lst_data.interval.split('/')
                    out['Interval Start'].append(interval[0])
                    out['Interval End'].append(interval[1])
                    print("out", out)
        else:
            metric_name = query.metrics[0]
            out['queue_id'].append(queue_id)
            out[metric_name+"_count"].append('')
            out[metric_name+"_sum"].append('')
            out[metric_name+".denominator"].append('')
            out[metric_name+".numerator"].append('')
            interval = query.interval.split('/')
            out['Interval Start'].append(interval[0])
            out['Interval End'].append(interval[1])

        print(out)
        df = pd.DataFrame(out)
        print (df)
        

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多