【问题标题】:Transform hierarchical CSV data to JSON将分层 CSV 数据转换为 JSON
【发布时间】:2021-06-18 11:07:56
【问题描述】:

我有一个 csv 表来描述这个graph 的子父关系:

CHILD PARENT
1     7
2     7
2     8
3     8
4     8
5     10
6     10
7     11
8     11
8     root
9     12
10    12
11    root
12    root

如何将这个转换成这个json文件?

graph = 
{"name":"root", "children":[
     {"name":"11", "children":[
          {"name":"7", "children":[ 
              {"name":"1"},
              {"name":"2"}
          ]},
         {"name":"8", "children":[
             {"name":"2"},
             {"name":"3"},
             {"name":"4"}
         ]},
     ]},
    {"name":"8", "children":[
        {"name":"2"},
        {"name":"3"},
        {"name":"4"}
    ]},
    {"name":"12", "children":[
        {"name":"9"},
        {"name":"10", "children":[
            {"name":"5"},
            {"name":"6"}
        ]}
    ]}
]}

请注意,这是flare.json 格式,但csv 中的数据不是像flare 数据集那样的树。 graph 中的节点可以有超过 1 个父节点,以重复结束(参见上面 json 中的节点 2 和 8)。 我的第一次尝试是创建一个递归函数,但我还没有想出一个可行的解决方案。任何解决方案,无论是否递归,都值得赞赏。

【问题讨论】:

标签: python json pandas csv


【解决方案1】:

简单的数据结构——不平衡树的递归下降。

import io

df = pd.read_csv(
    io.StringIO(
        """CHILD PARENT
1     7
2     7
2     8
3     8
4     8
5     10
6     10
7     11
8     11
8     root
9     12
10    12
11    root
12    root"""
    ),
    sep="\s+",
)


def traverse(parent, d):
    return {
        **{
            "name": parent,
        },
        # only create "children" key if node has some children
        **{
            k: [
                traverse(c, d)
                for c in d.loc[d["PARENT"].eq(str(parent)), "CHILD"]
            ] for k in ["children"] if len(d.loc[d["PARENT"].eq(str(parent))])>0
        },
    }


traverse("root", df)

输出

{'name': 'root',
 'children': [{'name': 8, 'children': [{'name': 2}, {'name': 3}, {'name': 4}]},
  {'name': 11,
   'children': [{'name': 7, 'children': [{'name': 1}, {'name': 2}]},
    {'name': 8, 'children': [{'name': 2}, {'name': 3}, {'name': 4}]}]},
  {'name': 12,
   'children': [{'name': 9},
    {'name': 10, 'children': [{'name': 5}, {'name': 6}]}]}]}

【讨论】:

    猜你喜欢
    • 2014-09-25
    • 2021-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多