Вот как я бы подошел к проблеме, если я правильно ее понял:
import numpy as np
import pandas as pd
data = {'c1':['A','B','C','D','E'],'factor':[0.001,0.2,0.2,0.2,0.3]}
df = pd.DataFrame(data)
df['factor_rescaled'] = df['factor'] / df['factor'].sum()
available = int(input('Available = '))
df['result'] = np.where(round(df['factor_rescaled']*available,0) < 1,1,round(df['factor_rescaled']*available,0))
print(df)
Передача значения 6 дает следующий результат:
c1 factor factor_rescaled result
0 A 0.001 0.001110 1.0
1 B 0.200 0.221976 1.0
2 C 0.200 0.221976 1.0
3 D 0.200 0.221976 1.0
4 E 0.300 0.332963 2.0
Изменение масштаба выполнено чтобы убедиться, что если факторы слишком высоки или низки, значение available
полностью распределено и не перераспределено. Наконец, я не уверен, откуда взялась эта цифра available
, поэтому я просто поместил ее в качестве ввода, например, 6
.
Окончательное редактирование: использование np.where из-за Почему np.where быстрее, чем pd.apply