【问题标题】:how to parse this hard json to dataframe in python?如何在python中将这个硬json解析为数据框?
【发布时间】:2020-02-05 17:17:39
【问题描述】:

关于这个话题的另一个问题。

这个社区有几个关于它的问题和答案:

  1. how to convert json to csv in python
  2. Convert Json to CSV using Python
  3. Python convert JSON to CSV
  4. Convert JSON to CSV with Python 3
  5. 接下来...

但我认为在这种情况下,它不适用于这种硬 json:

我的 JSON:

    {
   "took":32,
   "timed_out":false,
   "_shards":{
      "total":4,
      "successful":4,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":{
         "value":94,
         "relation":"eq"
      },
      "max_score":"None",
      "hits":[

      ]
   },
   "aggregations":{
      "hostname":{
         "doc_count_error_upper_bound":0,
         "sum_other_doc_count":0,
         "buckets":[
            {
               "key":"396",
               "doc_count":47,
               "process_name":{
                  "doc_count_error_upper_bound":0,
                  "sum_other_doc_count":16,
                  "buckets":[
                     {
                        "key":"accounts-daemon",
                        "doc_count":2,
                        "process_state":{
                           "doc_count_error_upper_bound":0,
                           "sum_other_doc_count":0,
                           "buckets":[
                              {
                                 "key":"sleeping",
                                 "doc_count":2,
                                 "process_pid":{
                                    "doc_count_error_upper_bound":0,
                                    "sum_other_doc_count":0,
                                    "buckets":[
                                       {
                                          "key":1092,
                                          "doc_count":2,
                                          "process_ppid":{
                                             "doc_count_error_upper_bound":0,
                                             "sum_other_doc_count":0,
                                             "buckets":[
                                                {
                                                   "key":1,
                                                   "doc_count":2,
                                                   "process_pgid":{
                                                      "doc_count_error_upper_bound":0,
                                                      "sum_other_doc_count":0,
                                                      "buckets":[
                                                         {
                                                            "key":1092,
                                                            "doc_count":2,
                                                            "process_cmdline":{
                                                               "doc_count_error_upper_bound":0,
                                                               "sum_other_doc_count":0,
                                                               "buckets":[
                                                                  {
                                                                     "key":"/usr/lib/accountsservice/accounts-daemon",
                                                                     "doc_count":2,
                                                                     "process_username":{
                                                                        "doc_count_error_upper_bound":0,
                                                                        "sum_other_doc_count":0,
                                                                        "buckets":[
                                                                           {
                                                                              "key":"root",
                                                                              "doc_count":2,
                                                                              "process_cwd":{
                                                                                 "doc_count_error_upper_bound":0,
                                                                                 "sum_other_doc_count":0,
                                                                                 "buckets":[
                                                                                    {
                                                                                       "key":"/",
                                                                                       "doc_count":2,
                                                                                       "process_cpu_start_time":{
                                                                                          "doc_count_error_upper_bound":0,
                                                                                          "sum_other_doc_count":0,
                                                                                          "buckets":[
                                                                                             {
                                                                                                "key":1570456346000,
                                                                                                "key_as_string":"2019-10-07T13:52:26.000Z",
                                                                                                "doc_count":2,
                                                                                                "process_fd_limit_hard":{
                                                                                                   "value":4096.0
                                                                                                },
                                                                                                "process_fd_open":{
                                                                                                   "value":8.0
                                                                                                },
                                                                                                "process_memory_size":{
                                                                                                   "value":281055232.0
                                                                                                },
                                                                                                "process_memory_rss_bytes":{
                                                                                                   "value":6168576.0
                                                                                                },
                                                                                                "process_memory_share":{
                                                                                                   "value":5464064.0
                                                                                                },
                                                                                                "process_cpu_total_pct":{
                                                                                                   "value":0.0005
                                                                                                },
                                                                                                "process_fd_limit_soft":{
                                                                                                   "value":1024.0
                                                                                                },
                                                                                                "process_cpu_system_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_user_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_norm_pct":{
                                                                                                   "value":0.0005
                                                                                                },
                                                                                                "process_cpu_total_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_value":{
                                                                                                   "value":18775.0
                                                                                                }
                                                                                             }
                                                                                          ]
                                                                                       }
                                                                                    }
                                                                                 ]
                                                                              }
                                                                           }
                                                                        ]
                                                                     }
                                                                  }
                                                               ]
                                                            }
                                                         }
                                                      ]
                                                   }
                                                }
                                             ]
                                          }
                                       }
                                    ]
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            },
            {
               "key":"961",
               "doc_count":47,
               "process_name":{
                  "doc_count_error_upper_bound":0,
                  "sum_other_doc_count":16,
                  "buckets":[
                     {
                        "key":"accounts-daemon",
                        "doc_count":2,
                        "process_state":{
                           "doc_count_error_upper_bound":0,
                           "sum_other_doc_count":0,
                           "buckets":[
                              {
                                 "key":"sleeping",
                                 "doc_count":2,
                                 "process_pid":{
                                    "doc_count_error_upper_bound":0,
                                    "sum_other_doc_count":0,
                                    "buckets":[
                                       {
                                          "key":1070,
                                          "doc_count":2,
                                          "process_ppid":{
                                             "doc_count_error_upper_bound":0,
                                             "sum_other_doc_count":0,
                                             "buckets":[
                                                {
                                                   "key":1,
                                                   "doc_count":2,
                                                   "process_pgid":{
                                                      "doc_count_error_upper_bound":0,
                                                      "sum_other_doc_count":0,
                                                      "buckets":[
                                                         {
                                                            "key":1070,
                                                            "doc_count":2,
                                                            "process_cmdline":{
                                                               "doc_count_error_upper_bound":0,
                                                               "sum_other_doc_count":0,
                                                               "buckets":[
                                                                  {
                                                                     "key":"/usr/lib/accountsservice/accounts-daemon",
                                                                     "doc_count":2,
                                                                     "process_username":{
                                                                        "doc_count_error_upper_bound":0,
                                                                        "sum_other_doc_count":0,
                                                                        "buckets":[
                                                                           {
                                                                              "key":"root",
                                                                              "doc_count":2,
                                                                              "process_cwd":{
                                                                                 "doc_count_error_upper_bound":0,
                                                                                 "sum_other_doc_count":0,
                                                                                 "buckets":[
                                                                                    {
                                                                                       "key":"/",
                                                                                       "doc_count":2,
                                                                                       "process_cpu_start_time":{
                                                                                          "doc_count_error_upper_bound":0,
                                                                                          "sum_other_doc_count":0,
                                                                                          "buckets":[
                                                                                             {
                                                                                                "key":1570450883000,
                                                                                                "key_as_string":"2019-10-07T12:21:23.000Z",
                                                                                                "doc_count":2,
                                                                                                "process_fd_limit_hard":{
                                                                                                   "value":4096.0
                                                                                                },
                                                                                                "process_fd_open":{
                                                                                                   "value":8.0
                                                                                                },
                                                                                                "process_memory_size":{
                                                                                                   "value":281153536.0
                                                                                                },
                                                                                                "process_memory_rss_bytes":{
                                                                                                   "value":5992448.0
                                                                                                },
                                                                                                "process_memory_share":{
                                                                                                   "value":5279744.0
                                                                                                },
                                                                                                "process_cpu_total_pct":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_fd_limit_soft":{
                                                                                                   "value":1024.0
                                                                                                },
                                                                                                "process_cpu_system_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_user_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_norm_pct":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_value":{
                                                                                                   "value":13410.0
                                                                                                }
                                                                                             }
                                                                                          ]
                                                                                       }
                                                                                    }
                                                                                 ]
                                                                              }
                                                                           }
                                                                        ]
                                                                     }
                                                                  }
                                                               ]
                                                            }
                                                         }
                                                      ]
                                                   }
                                                }
                                             ]
                                          }
                                       }
                                    ]
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

我几乎尝试了所有方法,并使用可怕的多循环代码解析它,但我认为有更简单的方法可以做到这一点,但这个社区中没有任何帖子可以帮助我。

你能帮我得到这样的东西吗?:

我的结果(不完整):

   hostname     process_name process_state  ...  process_username  process_cwd    process_cpu_start_time
0       396  accounts-daemon      sleeping  ...              root            /  2019-10-07T13:52:26.000Z
1       396           iscsid      sleeping  ...              root            /  2019-10-07T13:52:27.000Z
2       396           iscsid      sleeping  ...              root            /  2019-10-07T13:52:28.000Z
3       396      ksoftirqd/0      sleeping  ...              root            /  2019-10-07T13:52:28.000Z
4       396      kworker/0:1      sleeping  ...              root            /  2019-10-07T13:52:28.000Z
..      ...              ...           ...  ...               ...          ...                       ...
25      961          polkitd      sleeping  ...              root            /  2019-10-07T12:21:31.000Z
26      961        rcu_sched      sleeping  ...              root            /  2019-10-07T12:21:31.000Z
27      961          systemd      sleeping  ...              root            /  2019-10-07T12:20:24.000Z
28      961  systemd-journal      sleeping  ...              root            /  2019-10-07T12:20:38.000Z
29      961  unattended-upgr      sleeping  ...              root            /  2019-10-07T12:21:26.000Z

我知道这并不容易,所以我将不胜感激。

提前致谢。

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    想法

    主要思想是向下导航 JSON 对象的结构。 为了使程序可读,我想出了 2 个函数,它们执行 此导航并将沿下降路径的键附加到列表 (当前行的内容)。

    向下导航 JSON 对象的函数

    功能一:

    def dig(dct, path):
        ret = dct
        for step in path.split('.'):
            if step not in ret:
                print(f'**** No {step} element.')
                return None
            ret = ret[step]
            if isinstance(ret, list):
                ret = ret[0]
        return ret
    

    这个函数“挖掘”dct - 一个字典(一个JSON 对象), 沿着 path(点分隔的字符串)。 一个额外的细节是,如果目标子对象(函数 descended) 是一个list,那么还有一个额外的“go down”步骤,即 函数下降到此列表的第一个元素。 返回值是“最终”的子对象,毕竟是下降的。

    功能2:

    def dig2(dct, step, res, key='key'):
        dct = dig(dct, step + '.buckets')
        res.append(dct[key])
        return(dct)
    

    参数:

    • dct - 源字典,
    • step - 下降路径的第一步,
    • res - 结果列表,在descend之后附加key,
    • key - 从目标子对象读取的键名。

    此函数可加快源对象的向下导航。您只指定 第一个 step 并且这个函数下降了一步(到 buckets)。 然后 res 会附加在此级别找到的 key

    返回值再次是“最终”子对象,用于执行 进一步下降。

    读取源 JSON 文件

    为了读取您的 JSON 字符串,我将其保存在一个文件中,如下所示:

    with open('input.json') as json_file:
        data = json.load(json_file)
    

    步骤列表

    向下导航源对象的步骤列表如下:

    steps = ['hostname', 'process_name', 'process_state', 'process_pid',
        'process_ppid', 'process_pgid', 'process_cmdline',
        'process_username', 'process_cwd', 'process_cpu_start_time']
    

    这个列表也是结果DataFrame中的列名列表。

    主程序

    tbl = []
    for buck in dig(data, 'aggregations.hostname')['buckets']:
        res = [buck['key']]
        for step in steps[1:-1]:
            buck = dig2(buck, step, res)
        dig2(buck, steps[-1], res, 'key_as_string')
        tbl.append(res)
    result = pd.DataFrame(tbl, columns=steps)
    

    首先我们创建 tbl - 一个空列表,其中包含后续行的数据 将被收集。

    然后,for buck in ...aggregations.hostname 内的每个 bucket 进行操作。

    当前行结果的第一个元素是当前bucket中的key

    之后,for step in steps[1:-1] 深入到以下步骤,不包括最后一步, 并将每个 key 添加到结果列表中。

    降序的最后一步在这个循环之外,因为这一次的关键是 append 是 key_as_string,最后是 res(当前行的数据) 被添加到 tbl

    循环之后,结果DataFrame被创建。

    由于您帖子中包含的源 JSON 对象仅包含 2 个存储桶, 此 DataFrame 仅包含 2 行。

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2020-08-27
      • 2022-01-16
      相关资源
      最近更新 更多