【问题标题】:How to convert hierarchical table to json如何将分层表转换为json
【发布时间】:2019-05-21 03:27:16
【问题描述】:

我正在尝试将多级层次结构表转换为特定的 JSON 格式以用于我正在创建的视觉效果。

我在 pandas 数据框中有数据,并尝试按不同级别对其进行分组,但随后无法使用 pandas 将 groupby 转换为 json。我也尝试将数据框转换为 json,但格式不正确。我不确定还能做什么来获得我正在寻找的父/子格式。所有“大小”值只需要为 1,这样这部分看起来就足够简单了…… 提前致谢!

**This is what my data looks like**
ColA     ColB     ColC   
Parent1  Child1   
Parent1  Child2   Child2A 
Parent1  Child2   Child2B
Parent1  Child3   Child2A
Parent2  Child1
Parent2  Child2   Child2A

我从 pandas 数据框 to_json 得到的是逐列创建 json,所以我失去了它的层次结构方面。

所以它:

data = {"Parent1}"{"index #":"col2 value"

我想要的是:

data = ({ "name":"TEST",
"children": [
  {
    "name": "Parent1",
    "children": 
      [
      {
        "name": "Child1",
        "size": "1"
      },
      {
      "name":"Child2",
        "children": 
        [
        {
          "name":"Child2A",
          "size":"1" 
        },
        {
          "name":"Child2B",
          "size":"1" 
        },
        {
          "name":"Child2C",
          "size":"1" 
        },
        {
          "name":"Child2D",
          "size":"1" 
        },
        ],
      },
    {
      "name":"Parent2",
      "children": [
        {
          "name":"Child2A",
          "size":"1" 
        },
        {
          "name":"Child2B",
          "size":"1" 
        },
        {
          "name":"Child2C",
          "size":"1" 
        },
      ]
    },
    ]
  },
  {
    "name": "Parent3",
    "children": 
    [
      {
        "name": "Child1",
        "size": "1",
      },
      {
      "name":"Child2",
      "children": 
      [
        {
          "name":"Child2A",
          "size":"1" 
        },
        {
          "name":"Child2B",
          "size":"1" 
        },
        {
          "name":"Child2C",
          "size":"1" 
        },
      ],
    },
    {
      "name":"Child3",
      "children": 
      [
        {
          "name":"Child3A",
          "size":"1" 
        },
      ],
    },
    ],
  },
]})

【问题讨论】:

  • 没有直接的库/解决方案,首先您需要转换您的dataframe to JSON,然后您需要以您的方式自定义 JSON。
  • 感谢您的回复,您能否提供一些指导,说明我将如何对其进行自定义以使其成为该格式?

标签: python json hierarchical-data


【解决方案1】:

我们来了

import json

data = [
    'Parent1  Child1',
    'Parent1  Child2   Child2A',
    'Parent1  Child2   Child2B',
    'Parent1  Child3   Child2A',
    'Parent2  Child1',
    'Parent2  Child2   Child2A',
]

tree = {}

for d in data:
    node = None
    for item in d.split():
        name = item.strip()  # dont need spaces
        current_dict = tree if node is None else node
        node = current_dict.get(name)
        if not node:
            node = {}
            current_dict[name] = node


def walker(src, res):
    for name, value in src.items():
        node = {'name': name, 'size': 1}
        if 'children' not in res:
            res['children'] = []
        res['children'].append(node)
        walker(value, node)

result = {'name': 'TEST'}
walker(tree, result)

print (json.dumps(result, indent = True))

【讨论】:

  • 葡萄,谢谢你,一个问题。我进行了测试,对于具有多个单词的元素,代码将每个单词拆分为自己的“名称”,如果数据是“父母 A”或“简·史密斯”,有没有办法进行这项工作?还是必须是“JaneSmith”?
  • 你可以使用underscope代替空格。否则你如何建议像john doe smith这样的分割线?你永远不知道一个人在哪里结束,另一个人从哪里开始
  • 最好的办法是在文件中使用逗号而不是空格。然后你会得到 CSV 并且可以轻松地使用长名称。但在这种情况下,您应该将代码更新为split(','),并且不要忘记调用strip() 以消除两边的空格
  • 谢谢大家,这主要是有效的,我现在解决的唯一问题是这确实为每个名称附加了一个“大小”,并且在有“子”元素的情况下应该不是大小。
  • 这确实有效,但确实出现了一个需要额外清理的问题,即每个子元素都被赋予了大小,如果子元素也有子元素,则它不需要大小。否则葡萄的想法就像一个魅力!
猜你喜欢
  • 2014-09-25
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多