python - 使用 pandas 定义部门层次结构
问题描述
给定以下结构:
data1 = {
'emp': [1, 2, 3, 4, 5, 6, 7, 8, 9],
'dep': [100, 500, 200, 100, 200, 300, 400, 300, 200],
'boss': [6, 7, 6, 6, 6, 7, None, 7, 6]}
df1 = pd.DataFrame(data1, columns = ['emp', 'dep', 'boss'])
数据来自平面 CSV 文件。现在我必须在部门之间建立层次结构。规则如下:
- 每个员工都在一个部门工作
- 员工可能有老板(CEO 没有老板)
- 老板工作的部门是给定员工的上级部门
- 上级部门没有父级
预期的结果是这样的:
dep parent boss
0 100 300.0 6
1 500 400.0 7
2 200 300.0 6
3 300 400.0 7
4 400 NaN 7
有没有什么熊猫技巧可以解决这个问题?我可以通过读取 CSV 文件并使用 dicts 以迭代的方式实现这一点,但我的目标是用 pandas 解决这个问题。任何的想法?
编辑: 示例数据中存在错误。Emp 8 当然和 emp 6 有相同的老板。
解决方案
您可以将 df1 与自身合并以找到当前老板的部门,然后仅保留相关列并删除重复项。要使其工作,boss 栏必须填写 emp 栏,才能最终拥有上级部门的老板。
在 Pandas 中,它可能是:
df2 = df1[['boss', 'dep']].assign(boss=df1['boss'].combine_first(
df1['emp'])).merge(df1[['emp', 'dep']].rename(
columns={'dep': 'parent'}), how='left', left_on='boss', right_on='emp'
)[['dep', 'parent', 'boss']].drop_duplicates().astype('int')
def2.loc[df2['parent'] == df2['dep'], 'parent'] = np.nan # a dep cannot be its parent
正如预期的那样:
dep parent boss
0 100 300.0 6
1 500 400.0 7
2 200 300.0 6
5 300 400.0 7
6 400 NaN 7
推荐阅读
- excel - 简单的 Visual basic If 图像
- css - 如何使 SVG “填充” 以类似于 CSS “background-position:right top” 的方式运行
- reactjs - 使用对话框中的状态按钮或 Material UI 中的警报来反应内存泄漏警告
- flow-project - 运行示例“traffic_light_grid.py”时出现“观察值超出预期值范围”错误
- docker - 在 Docker Swarm 上的 Traefik v2 中使用通配符证书
- java - 坚持获取数组中某些元素的总数和计数
- javascript - 如何从非异步函数网络调用异步函数
- python - 在比较数据框中特定值的值范围作为另一个查询的一部分时,如何生成布尔值?
- php - 从 WMIC 获取 CPU 负载只能在提示符下工作,而不是通过在 PHP 中使用 exec() 调用
- c++ - c ++循环,其中对象的值减小直到某个点