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