如何将分层表格转换为JSON

3

我正在尝试将一个多级层次的表格转换成特定的JSON格式,以便创建一个可视化。

我已经将数据存储在一个pandas dataframe中,并尝试按不同的级别进行分组,但是无法使用pandas将groupby转换为json。我也尝试过将dataframe直接转换为json,但格式不正确。我不知道还有什么其他方法可以获得我想要的父/子格式。所有“size”值只需要为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 dataframe转换成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" 
        },
      ],
    },
    ],
  },
]})

没有直接的库/解决方案,首先需要将您的数据框转换为JSON,然后按照您的方式自定义JSON。 - Soumendra
谢谢您的回复,您能提供一些指导,告诉我如何自定义它以使其符合那种格式吗? - Katy
1个回答

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))

Grapes,谢谢您的帮助,我有一个问题。我进行了一个测试,在多个单词的元素中,代码会将每个单词拆分成自己的“名称”,如果数据是“Parent A”或“Jane Smith”,是否有方法使其工作?或者必须是“JaneSmith”? - Katy
你可以使用下划线代替空格。否则,你如何建议拆分像 john doe smith 这样的行?你永远不知道一个人在哪里结束,另一个人在哪里开始。 - grapes
最好的想法是在文件中使用逗号而不是空格。然后您就可以获得CSV,并且可以轻松地使用长名称。但在这种情况下,您应该更新代码以使用 split(','),并不要忘记调用 strip() 去除两侧的空格。 - grapes
谢谢大家,这基本上起作用了,我现在正在解决的唯一问题是,它会将“size”附加到每个名称上,在存在“children”元素的情况下不应该有大小。 - Katy
这个确实起作用了,但出现了一个问题,需要进行一些额外的清理,即每个子元素都被赋予了一个大小,如果一个子元素还有子元素,则它不需要大小。否则,Grape的想法非常好! - Katy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接