我有一个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
解决,但我不熟悉要断言的包。然而,你可以尝试这个解决方案,看看它是否适合你的用例:
在第二个数据帧中获取employee
和manager
的组合.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