我有一个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我正在尝试创建这个主Dataframe,它有每个员工完成的销售,还映射了每个员工向其报告的经理
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基本上,每个经理都继承了他们的下属编号,如果他们以自己的名义进行销售,也会继承他们的编号。
发布于 2021-06-03 06:40:14
这可以用networkx来解决,但是我不熟悉要断言的包。但是,您可以尝试此解决方案,看看它是否适合您的用例:
在第二个数据帧中获取employee和manager的组合/压缩:
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映射到employee,并使用结果数据与第一个数据帧合并:
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_5https://stackoverflow.com/questions/67812095
复制相似问题