将数据框转换为 python 中的分层字典

convert dataframe with to hierarchical dictionary in python

我有分层结构的数据框:

df = pd.DataFrame(
    {
        'parent_id': [0,1,2,3,0,5,6,6],
        'id': [1,2,3,4,5,6,7,8],
        'title':['Math',
            'Algebra',
            'Polynomials',
            'sum of polynomials',
            'Physics',
            'Mechanics',
            'Kinematics ',
            'Dynamics']
    }
)

我table结构是:

id parent_id title
1 0 Math
2 1 Algebra
3 2 Polynomials
4 3 sum of polynomials
5 0 Physics
6 5 Mechanics
7 6 Kinematics
8 6 Dynamics

我需要获取分层字典:

SampleJSONData_2 = [
{
    'id': 1,
    'title': 'Math',
    'subs': [
        {
            'id': 2,
            'title': 'Algebra',
            'subs': [
                {
                    'id': 3,
                    'title': 'Polynomials',
                    'subs':
                        [
                            {
                                'id': 4,
                                'title': 'sum of polynomials',
                            }
                        ]
                }]
        }]
},
{
    'id': 5,
    'title': 'Physics',
    'subs': [
        {
            'id': 6,
            'title': 'Mechanics',
            'subs': [
                {
                    'id': 7,
                    'title': 'Kinematics'
                },
                {
                    'id': 8,
                    'title': 'Dynamics'
                }

            ]
        }]
}

]

我该如何解决我的问题?

尝试:

def get_tree(df, parent=0):
    out = []
    for _, row in df[df.parent_id == parent].iterrows():
        out.append({"id": row["id"], "title": row["title"]})

        subs = df[df.parent_id == row["id"]]
        if len(subs) > 0:
            out[-1]["subs"] = get_tree(df, parent=row["id"])

    return out


print(get_tree(df))

打印:

[
    {
        "id": 1,
        "title": "Math",
        "subs": [
            {
                "id": 2,
                "title": "Algebra",
                "subs": [
                    {
                        "id": 3,
                        "title": "Polynomials",
                        "subs": [{"id": 4, "title": "sum of polynomials"}],
                    }
                ],
            }
        ],
    },
    {
        "id": 5,
        "title": "Physics",
        "subs": [
            {
                "id": 6,
                "title": "Mechanics",
                "subs": [
                    {"id": 7, "title": "Kinematics "},
                    {"id": 8, "title": "Dynamics"},
                ],
            }
        ],
    },
]