首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值赋值给具有时间和累计条件的列

将值赋值给具有时间和累计条件的列
EN

Stack Overflow用户
提问于 2022-07-23 14:29:58
回答 1查看 51关注 0票数 -1

我试过这个解决办法,但对我没有用。我要解释一下整个问题。我要做的是优化将客户分配给商业雇员。这些列将是"center“(商业部门)、" client”(客户端的编号)、" user“(如果客户端没有用户,这意味着它是一个新的客户端)、”assigned_user“和"assigned_user",这些列应该是根据优化标准分配给该客户端的最终员工。我最初的df是:

代码语言:javascript
复制
df = pd.DataFrame({
"center": ['0060','0060','0060','0060','0060','0060','0060','0060','0060','0060','0070','0070','0070','0070','0070','0070','0070','0070','0080','0080','0080','0080','0080','0080','0080','0080','0080','0080','0080','0080','0080'],
"client": ['C00001','C00002','C00003','C00004','C00005','C00006','C00007','C00008','C00009','C00010','C00011','C00012','C00013','C00014','C00015','C00016','C00017','C00018','C00019','C00020','C00021','C00022','C00023','C00024','C00025','C00026','C00027','C00028','C00029','C00030','C00031'],
"user": ['A','A','A','A','A','B','B','B','NaN','NaN','C','C','C','C','C','D','D','D','E','E','E','E','E','F','F','F','G','G','NaN','NaN','NaN'],
"value": [5,5,3,5,2,5,2,2,2,3,5,4,4,1,1,3,3,3,5,3,2,2,5,5,2,2,5,3,1,2,3], 
"assigned_user": ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN']
})

我需要的是根据每个员工和中心客户的价值做出最优的分配。例如,对于中心(或部门) 0060,我有两个雇员(A & B),总值为clients = 34,因此每个用户都应该在列assigned_user中拥有总价值为17的客户端。在这个中心,根据列用户的说法,A有总价值为20的客户,B有9的客户。我必须重新分配客户在每个员工中保持最大可能,对于A,它需要释放一个值为3的客户,而对于B,它需要保留他的初始客户,得到未分配的客户(NaN在“用户”栏中),并得到A必须松的客户。

为中心0080,我们有3名员工(E,F& G),总客户价值40。每个员工的客户总价值应该在13.3左右(不一定要准确,只是最接近的可能值)。在这种情况下,根据“用户”一栏,E的总客户值为17,F的客户值为9,G的客户值为8。在这种情况下,也有3个没有员工的客户,总价值为6。在这种情况下,E应该释放值为3或4的客户端,将这些客户端(以及没有指定员工的客户)分配给员工F& G,并一如既往地保持F和G已经分配的员工的总价值,并且尝试F和G的总价值可能与"assigned_user“列中的13,3最接近(他们都可以有13或1个可能有14和其他12,它不在乎)。

EN

回答 1

Stack Overflow用户

发布于 2022-07-23 17:37:28

首先,这不是解决这个问题的优化方法,因为我并不完全依赖于numpy提供的广播概念。

而且,为了便于输入,我只使用了解决方案所需的有用列-- valueasigned_user

算法:

利用repeatitive occurrence

  • Finally,
  1. ,利用np.cumsum计算value
  2. 的累积和,然后对上述结果进行模块广播运算,给出了remender为0的索引数,这有助于我们利用累积差分法提取value的no值,得到每个字符的no值。

实现:

代码语言:javascript
复制
from operator import index
import pandas as pd
import numpy as np

df = pd.DataFrame({
    "value": [5, 5, 2, 3, 2, 3, 5, 5],
    "asigned_user":['A', 'A', 'B', 'B', np.nan, np.nan, np.nan, np.nan]
})

index = list(df.value[df.value.cumsum()%10 == 0].index + 1)
final_index = [index[0]]
final_index.extend(np.diff(index))

map_ = [j*i for i,j in zip(("A", "B", "C"), final_index)]
map_final = ''.join(map_)
df['assigned_user'] = list(map_final)

print(df)

输出:

代码语言:javascript
复制
   value asigned_user
0      5            A
1      5            A
2      2            B
3      3            B
4      2            B
5      3            B
6      5            C
7      5            C
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73091551

复制
相关文章

相似问题

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