【问题标题】:How to produce hierarchical JSON tree from pandas dataframe in Python如何在 Python 中从 pandas 数据帧生成分层 JSON 树
【发布时间】:2021-04-03 17:42:11
【问题描述】:

我想编写一个基于 JSON 数据返回树的函数。

这是一个熊猫数据框:

employee_id     designation     department      name      manager_emp_id
1                co-founder      co-founder      john         2
2                ceo             co-founder      rocky       
3                cto             tech            alfred       2
4                sde3            tech            bruce        3
5                sde1            tech            tony         4
6                cmo             marketing       steve        2
7                sde1            tech            bucky        3

这是我正在寻找的树的示例:

       ceo 
    /   |  \
   /    |   \
 cto   cmo   coo 
  |      |     \
  |      |      \
 sde3  sales   operative executives
  |
  |
 sde1 

输出格式:

期望的输出

{
    employee_id : 2, 
    name : rocky, 
    reportees : [
                    {
                        employee_id : 3, 
                        name : alfred, 
                        reportees:[....]
                    }
                ]
}

【问题讨论】:

    标签: python json python-3.x pandas tree


    【解决方案1】:

    你可以使用递归:

    d = [{'employee_id': 1, 'designation': 'co-founder', 'department': 'co-founder', 'name': 'john', 'manager_emp_id': 2}, {'employee_id': 2, 'designation': 'ceo', 'department': 'co-founder', 'name': 'rocky', 'manager_emp_id': ''}, {'employee_id': 3, 'designation': 'cto', 'department': 'tech', 'name': 'alfred', 'manager_emp_id': 2}, {'employee_id': 4, 'designation': 'sde3', 'department': 'tech', 'name': 'bruce', 'manager_emp_id': 3}, {'employee_id': 5, 'designation': 'sde1', 'department': 'tech', 'name': 'tony', 'manager_emp_id': 4}, {'employee_id': 6, 'designation': 'cmo', 'department': 'marketing', 'name': 'steve', 'manager_emp_id': 2}, {'employee_id': 7, 'designation': 'sde1', 'department': 'tech', 'name': 'bucky', 'manager_emp_id': 3}]
    def get_tree(_id = ''):
       return [{'employee_id':i['employee_id'], 
                'name':i['name'], 
                **({} if not (rp:=get_tree(i['employee_id'])) else {'reportees':rp})} 
                for i in d if i['manager_emp_id'] == _id]
    
    print(get_tree())
    

    输出:

    [{'employee_id': 2, 'name': 'rocky', 'reportees': [{'employee_id': 1, 'name': 'john'}, {'employee_id': 3, 'name': 'alfred', 'reportees': [{'employee_id': 4, 'name': 'bruce', 'reportees': [{'employee_id': 5, 'name': 'tony'}]}, {'employee_id': 7, 'name': 'bucky'}]}, {'employee_id': 6, 'name': 'steve'}]}]
    

    【讨论】:

    • 感谢工作,但如果没有“reportees”,我想要一个更新,那么不应该添加“reportees”键。
    • 请详细说明新添加的行,我看不懂代码
    • @DharmveerSingh 该代码使用列表推导来迭代d,仅包括实体的manager_emp_id 等于正在搜索的id 的员工。分配表达式(:=)用于查看员工是否有报告人,如果有,则添加reportees键。
    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多