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



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

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

employee, manager
emp_1, emp_3
emp_2, emp_3
emp_3, emp_4   
emp_4, emp_5

我正试图创建这个主数据框架,让每个员工都完成销售,并将各个员工报告的经理映射到

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

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

这可能可以用networkx解决,但我不熟悉要断言的包。然而,你可以尝试这个解决方案,看看它是否适合你的用例:

在第二个数据帧中获取employeemanager的组合.zip

zipped = zip(df2.employee, df2.manager)
zipped = [(first, last, int(last[-1])) for first, last in zipped]

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

from operator import itemgetter # cleaner if this is at the top
maximum = max(zipped, key = itemgetter(-1))[-1]

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

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映射到员工,并使用生成的数据与第一个数据帧合并:

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

最新更新