Python 将金额除以行

Python 将金额除以行,python,pandas,numpy,pyspark,Python,Pandas,Numpy,Pyspark,我想把一定数量的项目分成多行。每一行至少应该得到1,但其余的则根据其所需的份额,直到所有项目都已分发。 假设我们有6个,我想得到如下结果 使用max(1,系数*可用)不一定等于可用项目的总数 有办法吗? 我有spark环境中的数据,所以最酷的方法是pyspark甚至pandas/numpy解决方案。 显然,这可以很容易地在python循环中完成 输入: 可用总数6 +---+-------------+ | c1| factor| +---+-------------+ | A|

我想把一定数量的项目分成多行。每一行至少应该得到1,但其余的则根据其所需的份额,直到所有项目都已分发。 假设我们有6个,我想得到如下结果

使用
max(1,系数*可用)
不一定等于可用项目的总数

有办法吗? 我有spark环境中的数据,所以最酷的方法是pyspark甚至pandas/numpy解决方案。 显然,这可以很容易地在python循环中完成

输入: 可用总数6

+---+-------------+
| c1|       factor|
+---+-------------+
|  A|        0.001|
|  B|          0.2|
|  C|          0.2|
|  D|          0.2|
|  E|          0.3|
+---+-------------+
预期产出:

+---+-------------+---------+
| c1|       factor|   result|
+---+-------------+---------+
|  A|        0.001|        1|
|  B|          0.2|        1|
|  C|          0.2|        1|
|  D|          0.2|        1|
|  E|          0.3|        2|
+---+-------------+---------+

如果我理解正确,我将以这种方式处理这个问题:

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


最终编辑:使用np。由于

的原因,您可以使用pandas:

>>> df
  c1  factor
0  A   0.001
1  B   0.200
2  C   0.200
3  D   0.200
4  E   0.300
>>> available, s = 6, df.factor.sum()
>>> df['result'] = df.factor.apply(lambda x: round(max(1, (x/s)*available)))
>>> df
  c1  factor  result
0  A   0.001     1.0
1  B   0.200     1.0
2  C   0.200     1.0
3  D   0.200     1.0
4  E   0.300     2.0

你为什么说这行不通?输入应该是用户输入吗?或者它来自哪里?简单地定义列不起作用
df['factor']=max(1,df['factor']*可用)
available=int(输入('available='))
。您可以重新缩放
因子
,使其总是求和
1
,从而确保您的
可用
get完全分布,并与
因子
值成比例。问题是因子不求和1,因此如果使用available=1000,则无法完全分布。df['result'].sum()将是
901
,而不是
1000
。@CeliusStingher感谢您提到这个问题。我修改了解决方案。
>>> df
  c1  factor
0  A   0.001
1  B   0.200
2  C   0.200
3  D   0.200
4  E   0.300
>>> available, s = 6, df.factor.sum()
>>> df['result'] = df.factor.apply(lambda x: round(max(1, (x/s)*available)))
>>> df
  c1  factor  result
0  A   0.001     1.0
1  B   0.200     1.0
2  C   0.200     1.0
3  D   0.200     1.0
4  E   0.300     2.0