我希望计算有多少人低于一个给定的用户的数据框架。
| 雇员|经理|
| - ------|- ------|
| A类|- -|
| B|A类|
| C级|A类|
| D级|A类|
| E级|A类|
| F级|B|
| G级|B|
| 高|C级|
| 我|C级|
我想得到输出:I、H、G、F、E和D下面没有员工C下面有两个员工(H和I)B下面有两个员工(F和G)A下面有八个员工(B、C、D和E加上B和C的员工)
有人有什么建议吗?在我的DF中,我有更多的层次结构层和非常大量的数据。
我想过把它存储在字典里,然后做一个循环来更新它,但我认为这种解决方案一点效率都没有,我想知道有没有更高效的技术来解决这类问题。
2条答案
按热度按时间ac1kyiln1#
正如@34jbonz最初提到的,networkx是完成这项任务的最佳工具。然而,由于networkx提供了pandas接口,因此无需预处理数据
另外,应该避免使用
apply
和descendants
,因为这会导致某些计算被多次执行。这里,深度优先搜索是最有效的解决方案最后,可以从networkx图中批量提取信息作为dict,然后将其转换为 Dataframe 。
nnt7mjpx2#
我会使用
networkx
的有向图。这是一个超级有趣的python包。退货:
工作原理:图是节点和边。在这种情况下,你的节点是员工,你的边是经理和员工之间的关系。快速谷歌一下“networkx有向图”图像,你就会知道这在图像表示中是什么样子的。
(manager, employee)
元组的形式创建边,并将其保存在某个地方(我选择将其作为df
中的一列,称为edges
)。(manager, employee)
,将每个员工-经理关系作为边添加到图中。descendants
函数应用于每行的雇员apply
。