我有一组排名的数据。
df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],
'BBY': [0.9, 1, 1.2, 1, 1, 2.3, 2.4, 2.5, 3, 2.9],
'STJ': [4, 4.2, 4.3, 4.4, 3.5, 3, 2, 1, 1.2, 2],
'RBS': [0.5, 0.6, 0.7, 0.6, 1, 1.2, 1.3, 1.4, 1.5, 2]})
df1 = df.rank(1, ascending=False, method='first')
我有一个 1000 的数字,我正在尝试将其分配给 4 列。但是,每列的最大分配是 1000 列的 40%。从排名第一的列中填满。
例如,第一行如下所示:
available = 1000
max_allocation = 0.4
result = pd.DataFrame({'Date': ['02/01/2019'],
'VOD': 400
'BBY': 200
'STJ': 400
'RBS': 0})
在这种情况下,每列可以具有的最大值为 400 (1000*0.4(。作为排名最高的列,"STJ"首先填充 400。还剩下 600 个要分配,因为这比最多 400 个还要分配 400 个。这次是VOD排名第二的栏目。然后只剩下 200 个 - 少于 400 的最大分配。剩下的200个将被分配到排名第三的列 - "BBY"。没有剩余的内容可以分配给 RBS 列。
我已经考虑过使用一个类然后调整要分配的数量,但随着添加额外的行,它变得非常复杂。Numpy 哪里是另一个选择,但我无法让它处理可供分配的金额下降。
def allocation(rank):
return min(available * max_allocation, max(0, available - (rank - 1)* available * max_allocation))
pd.concat([df.Date, df1.applymap(allocation)], axis=1)
结果:
Date VOD BBY STJ RBS
0 02/01/2019 400.0 200.0 400.0 0.0
1 03/01/2019 400.0 200.0 400.0 0.0
2 04/01/2019 400.0 200.0 400.0 0.0
3 07/01/2019 400.0 200.0 400.0 0.0
4 08/01/2019 400.0 200.0 400.0 0.0
5 09/01/2019 400.0 200.0 400.0 0.0
6 10/01/2019 400.0 400.0 200.0 0.0
7 11/01/2019 400.0 400.0 0.0 200.0
8 14/01/2019 400.0 400.0 0.0 200.0
9 15/01/2019 0.0 400.0 400.0 200.0