首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas中基于父子关系的销售数据分层汇总

Pandas中基于父子关系的销售数据分层汇总
EN

Stack Overflow用户
提问于 2021-06-03 04:25:15
回答 1查看 84关注 0票数 2

我有一个Dataframe,其中包含每个销售人员的销售数据,如下所示:

代码语言:javascript
复制
employee, product, quantity
emp_1, prod_a, 100
emp_1, prod_b, 200
emp_2, prod_a, 30
emp_4, prod_c, 400    
emp_4, prod_a, 100

我有另一个具有团队层次结构的Dataframe

代码语言:javascript
复制
employee, manager
emp_1, emp_3
emp_2, emp_3
emp_3, emp_4   
emp_4, emp_5

我正在尝试创建这个主Dataframe,它有每个员工完成的销售,还映射了每个员工向其报告的经理

代码语言:javascript
复制
employee, product, quantity, manager
emp_1, prod_a, 100, emp_3
emp_1, prod_b, 200, emp_3
emp_2, prod_a, 30, emp_3
emp_1, prod_a, 100, emp_4
emp_1, prod_b, 200, emp_4
emp_2, prod_a, 30, emp_4
emp_4, prod_c, 400, emp_5
emp_4, prod_a, 100, emp_5
emp_1, prod_a, 100, emp_5
emp_1, prod_b, 200, emp_5
emp_2, prod_a, 30, emp_5

基本上,每个经理都继承了他们的下属编号,如果他们以自己的名义进行销售,也会继承他们的编号。

EN

回答 1

Stack Overflow用户

发布于 2021-06-03 06:40:14

这可以用networkx来解决,但是我不熟悉要断言的包。但是,您可以尝试此解决方案,看看它是否适合您的用例:

在第二个数据帧中获取employeemanager的组合/压缩:

代码语言:javascript
复制
zipped = zip(df2.employee, df2.manager)
zipped = [(first, last, int(last[-1])) for first, last in zipped]

获取每个元组的最后一个条目的最大值:

代码语言:javascript
复制
from operator import itemgetter # cleaner if this is at the top
maximum = max(zipped, key = itemgetter(-1))[-1]

使用最大值在员工和经理之间创建配对:

代码语言:javascript
复制
mapping = {first : last 
           if num == maximum else 
          [f"emp_{n}" for n in range(maximum, num -1, -1)] 
          for first, last, num in zipped}

mapping
{'emp_1': ['emp_5', 'emp_4', 'emp_3'],
 'emp_2': ['emp_5', 'emp_4', 'emp_3'],
 'emp_3': ['emp_5', 'emp_4'],
 'emp_4': 'emp_5'}

map映射到employee,并使用结果数据与第一个数据帧合并:

代码语言:javascript
复制
df1.merge(df2.assign(manager = df2.employee
                                  .map(mapping))
                                  .explode('manager')
            )

   employee  product   quantity manager
0     emp_1   prod_a        100   emp_5
1     emp_1   prod_a        100   emp_4
2     emp_1   prod_a        100   emp_3
3     emp_1   prod_b        200   emp_5
4     emp_1   prod_b        200   emp_4
5     emp_1   prod_b        200   emp_3
6     emp_2   prod_a         30   emp_5
7     emp_2   prod_a         30   emp_4
8     emp_2   prod_a         30   emp_3
9     emp_4   prod_c        400   emp_5
10    emp_4   prod_a        100   emp_5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67812095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档