Pandas Dataframe 到 JSON 层次结构

2023-11-26

我已经详尽地审查/尝试了与这一挑战相对应的所有其他问题的实现,但尚未找到解决方案。

问题:如何将员工和主管对转换为分层 JSON 结构以用于 D3 可视化?级别数量未知,因此它必须是动态的。

我有一个包含五列的数据框(是的,我意识到这不是 Office 的实际层次结构):

  Employee_FN Employee_LN Supervisor_FN Supervisor_LN  Level
0     Michael       Scott          None          None      0
1         Jim     Halpert       Michael         Scott      1
2      Dwight     Schrute       Michael         Scott      1
3     Stanley      Hudson           Jim       Halpert      2
4         Pam     Beasley           Jim       Halpert      2
5        Ryan      Howard           Pam       Beasley      3
6       Kelly      Kapoor          Ryan        Howard      4
7    Meredith      Palmer          Ryan        Howard      4 

所需的输出快照:

{
  "Employee_FN": "Michael",
  "Employee_LN": "Scott",
  "Level": "0",
  "Reports": [{
        "Employee_FN": "Jim",
        "Employee_LN": "Halpert",
        "Level": "1",
        "Reports": [{
              "Employee_FN": "Stanley",
              "Employee_LN": "Hudson",
              "Level": "2",
            }, {
              "Employee_FN": "Pam",
              "Employee_LN": "Beasley",
              "Level": "2",
            }]
        }]
}

当前状态:

j = (df.groupby(['Level','Employee_FN','Employee_LN'], as_index=False)
             .apply(lambda x: x[['Level','Employee_FN','Employee_LN']].to_dict('r'))
             .reset_index()
             .rename(columns={0:'Reports'})
             .to_json(orient='records'))

print(json.dumps(json.loads(j), indent=2, sort_keys=True))

电流输出:

[
  {
    "Employee_FN": "Michael",
    "Employee_LN": "Scott",
    "Level": 0,
    "Reports": [
      {
        "Employee_FN": "Michael",
        "Employee_LN": "Scott",
        "Level": 0
      }
    ]
  },
  {
    "Employee_FN": "Dwight",
    "Employee_LN": "Schrute",
    "Level": 1,
    "Reports": [
      {
        "Employee_FN": "Dwight",
        "Employee_LN": "Schrute",
        "Level": 1
      }
    ]
  },
  {
    "Employee_FN": "Jim",
    "Employee_LN": "Halpert",
    "Level": 1,
    "Reports": [
      {
        "Employee_FN": "Jim",
        "Employee_LN": "Halpert",
        "Level": 1
      }
    ]
  },
  {
    "Employee_FN": "Pam",
    "Employee_LN": "Beasley",
    "Level": 2,
    "Reports": [
      {
        "Employee_FN": "Pam",
        "Employee_LN": "Beasley",
        "Level": 2
      }
    ]
  },
  {
    "Employee_FN": "Stanley",
    "Employee_LN": "Hudson",
    "Level": 2,
    "Reports": [
      {
        "Employee_FN": "Stanley",
        "Employee_LN": "Hudson",
        "Level": 2
      }
    ]
  },
  {
    "Employee_FN": "Ryan",
    "Employee_LN": "Howard",
    "Level": 3,
    "Reports": [
      {
        "Employee_FN": "Ryan",
        "Employee_LN": "Howard",
        "Level": 3
      }
    ]
  },
  {
    "Employee_FN": "Kelly",
    "Employee_LN": "Kapoor",
    "Level": 4,
    "Reports": [
      {
        "Employee_FN": "Kelly",
        "Employee_LN": "Kapoor",
        "Level": 4
      }
    ]
  },
  {
    "Employee_FN": "Meredith",
    "Employee_LN": "Palmer",
    "Level": 4,
    "Reports": [
      {
        "Employee_FN": "Meredith",
        "Employee_LN": "Palmer",
        "Level": 4
      }
    ]
  }
]

问题:

  1. 每个人都只有小时候的自己
  2. 整个 JSON 结构似乎在一个字典中 - 我相信它必须用 {} 括起来才能可读

我尝试过切换groupby and lambda各种配置的元件也能达到所需的输出。任何和所有的见解将不胜感激!谢谢你!

Update:

我将代码块更改为:

j = (df.groupby(['Level','Supervisor_FN','Supervisor_LN'], as_index=False)
             .apply(lambda x: x[['Level','Employee_FN','Employee_LN']].to_dict('r'))
             .reset_index()
             .rename(columns={0:'Reports'})
             .rename(columns={'Supervisor_FN':'Employee_FN'})
             .rename(columns={'Supervisor_LN':'Employee_LN'})
             .to_json(orient='records'))

print(json.dumps(json.loads(j), indent=2, sort_keys=True))

新的输出是这样的:

[
  {
    "Employee_FN": "Michael",
    "Employee_LN": "Scott",
    "Level": 1,
    "Reports": [
      {
        "Employee_FN": "Jim",
        "Employee_LN": "Halpert",
        "Level": 1
      },
      {
        "Employee_FN": "Dwight",
        "Employee_LN": "Schrute",
        "Level": 1
      }
    ]
  },
  {
    "Employee_FN": "Jim",
    "Employee_LN": "Halpert",
    "Level": 2,
    "Reports": [
      {
        "Employee_FN": "Stanley",
        "Employee_LN": "Hudson",
        "Level": 2
      },
      {
        "Employee_FN": "Pam",
        "Employee_LN": "Beasley",
        "Level": 2
      }
    ]
  },
  {
    "Employee_FN": "Pam",
    "Employee_LN": "Beasley",
    "Level": 3,
    "Reports": [
      {
        "Employee_FN": "Ryan",
        "Employee_LN": "Howard",
        "Level": 3
      }
    ]
  },
  {
    "Employee_FN": "Ryan",
    "Employee_LN": "Howard",
    "Level": 4,
    "Reports": [
      {
        "Employee_FN": "Kelly",
        "Employee_LN": "Kapoor",
        "Level": 4
      },
      {
        "Employee_FN": "Meredith",
        "Employee_LN": "Palmer",
        "Level": 4
      }
    ]
  }
]

问题:

  1. The Level为底层员工和主管匹配底层员工
  2. 嵌套仅深一层

这类问题不太适合 Pandas。您要使用的数据结构是递归的,而不是表格。

这是一种可能的解决方案。

from operator import itemgetter

employee_key = itemgetter('Employee_FN', 'Employee_LN')
supervisor_key = itemgetter('Supervisor_FN', 'Supervisor_LN')

def subset(dict_, keys):
    return {k: dict_[k] for k in keys}

# store employee references
cache = {}

# iterate over employees sorted by level, so supervisors are cached before reports
for row in df.sort_values('Level').to_dict('records'):

    # look up employee/supervisor references
    employee = cache.setdefault(employee_key(row), subset(row, keys=('Employee_FN', 'Employee_LN', 'Level')))
    supervisor = cache.get(supervisor_key(row), {})

    # link reports to employee
    supervisor.setdefault('Reports', []).append(employee)

# grab only top-level employees
[rec for key, rec in cache.iteritems() if rec['Level'] == 0]
[{'Employee_FN': 'Michael',
  'Employee_LN': 'Scott',
  'Level': 0,
  'Reports': [{'Employee_FN': 'Jim',
    'Employee_LN': 'Halpert',
    'Level': 1,
    'Reports': [{'Employee_FN': 'Stanley',
      'Employee_LN': 'Hudson',
      'Level': 2},
     {'Employee_FN': 'Pam',
      'Employee_LN': 'Beasley',
      'Level': 2,
      'Reports': [{'Employee_FN': 'Ryan',
        'Employee_LN': 'Howard',
        'Level': 3,
        'Reports': [{'Employee_FN': 'Kelly',
          'Employee_LN': 'Kapoor',
          'Level': 4},
         {'Employee_FN': 'Meredith',
          'Employee_LN': 'Palmer',
          'Level': 4}]}]}]},
   {'Employee_FN': 'Dwight', 'Employee_LN': 'Schrute', 'Level': 1}]}]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas Dataframe 到 JSON 层次结构 的相关文章

  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 识别 pandas 数据框中各组之间的差异

    我有一个按日期和 ID 索引的 pandas 数据框 我想 识别日期之间增删的ID 将 ID 添加到另一个数据帧以及添加 删除的日期 date ID value 12 31 2010 13 0 124409 9 0 555959 1 0 7
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 类设计:数组与多个变量

    我有一些理论问题 但是这是我在设计类时有时会遇到的问题 并且在阅读其他代码时我发现它的做法有所不同 以下哪一项更好以及为什么 示例1 class Color public Color float float float Color frie
  • 高性能异步等待套接字

    我正在编写一个应用程序 需要通过 tcp 建立数百个套接字连接来读取 写入数据 我遇到过这段代码片段在这里我想知道如何才能使其更加稳健 这就是我当前调用代码的方式 foreach var ip in listofIps IPEndPoint
  • 防止软键盘被关闭

    有很多与如何以编程方式显示 隐藏软键盘相关的问题 然而 众所周知 android 后退按钮会导致键盘消失 有没有办法阻止用户通过按后退按钮来关闭键盘 我尝试捕获后退按钮 但是当键盘显示在我的活动中的 onKeyDown 时 按下后退键并且软
  • 将 pandas 数据框中的对象列转换为日期时间

    我在 pandas 数据框中有一个格式为 dd mm yyyy 的对象列 我想用 to datetime 进行转换 我尝试使用以下命令将其转换为日期时间 df Time stamp pd to datetime df Time stamp
  • Xcode - 目标特定本地化

    我的项目包括多个目标 每个目标用于不同的客户 有些客户需要特定的本地化 我不希望所有客户都获得这种特定的本地化 由于本地化是在项目级别处理的 因此我找不到仅针对特定目标添加本地化的方法 有什么建议如何去做吗 寻找稳定的选项 无需在每次构建之
  • 多次查询同一个表但在不同的列中mysql

    我正在尝试获取更多列来总结两个不同表的结果 SET start res 20150301 SET finish res 20150501 SET finish check 20150801 SET start check 20150301
  • 转储 g++ 中的包含路径

    我正在尝试编写一些构建脚本 并想确定包含的内容是否是系统包含的 所以我想要g 告诉我它正在使用的包含路径 cpp v似乎是明显的最佳选择 但它没有给我 C 路径 所以我尝试 g Xpreprocessor v 这不太正确 g 捕捉到 v因为
  • Flask 应用程序启动后运行代码

    我的目标是在 Flask 应用程序启动后运行任意代码 这是我所得到的 def run from webapp import app app run debug True use reloader False 理想情况下我能够这样做 def
  • 是否有开源线程安全的 C++ 对象池实现? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要创建一个套接字连接池 该连接池将服务于多个工作线程 是否有一个线程安全的对象池实现 其功能类似于 Apache Commons Generic
  • 如何使用 JQuery/JS 获取给定 url(外部 url)的网页标题

    我是新手 如果这是一个愚蠢的问题 请原谅 所以我试图使用 JQuery JS 获取 URL 的标题 我不想加载 url 的内容 然后解析其中的标签 让我说得更清楚 我有一组网址 比如说 20 个 我想显示它们的标题 我指的网址不是当前的网址
  • 使 Spring bean 的行为类似于 ExecutorService 的 ThreadLocal 实例

    在我的网络应用程序中 我有一个后台服务 该服务使用包含 Engine 类和ExecutorService配置为使用多个线程并接受 GeneratorTasks Component public class Generator Autowir
  • 在 Entity Framework 4.1 Code First 中手动生成主键的最佳方法是什么

    在 Entity Framework 4 1 Code First 中手动生成主键的最佳方法是什么 我正在对 ASP NET MVC 3 进行编程 并使用存储库模式 我目前使用以下代码按顺序生成密钥 Code First Class Pub
  • 带有自定义比较函数对象的 STL Map

    我想使用 STL 的 Map 容器通过使用二进制数据作为键来查找指针 所以我编写了这个自定义函数对象 struct my cmp bool operator unsigned char const a unsigned char const
  • Boost 的 y=Ax 线性代数解

    boost有吗 其中 A y 和 x 分别是矩阵 稀疏且可以很大 和向量 y 或 x 可能是未知的 我在这里似乎找不到它 http www boost org doc libs 1 39 0 libs numeric ublas doc i
  • 在单元测试中比较 numpy float 数组[重复]

    这个问题在这里已经有答案了 实现比较两个 numpy float 数组的单元测试的最佳方法是什么 我尝试过unittest assertEqual 但对浮点数组不起作用 因为浮点永远不会100 相等 我不能使用assertAlmostEqu
  • printf 和 ++ 运算符[重复]

    这个问题在这里已经有答案了 include
  • 将字符串添加到逐字字符串文字中

    我有一个名为 defaultPath 的路径 我想将其添加到这个逐字字符串文字中 但可以完全获取它周围的引号 C Mavro MavBridge Server MavBridgeService exe service data Data 我
  • 在 ColdFusion 中使用表单数组?

    我不知道如何在 ColdFusion 9 中处理这个问题 我有一个正在提交的表单 POST 其中包含元素复选框 称为 items 当我做一个
  • Nosetest 包括不需要的父目录

    我试图将鼻子测试限制到特定目录 但是在测试运行期间 它包括我要定位的目录的父目录 这样做会引发错误 以下是测试运行输出的关键要素 nose importer DEBUG Add path projects myproject myproje
  • Pandas Dataframe 到 JSON 层次结构

    我已经详尽地审查 尝试了与这一挑战相对应的所有其他问题的实现 但尚未找到解决方案 问题 如何将员工和主管对转换为分层 JSON 结构以用于 D3 可视化 级别数量未知 因此它必须是动态的 我有一个包含五列的数据框 是的 我意识到这不是 Of