Python 对于重复行,创建分数值以填充另一列

Python 对于重复行,创建分数值以填充另一列,python,pandas,numpy,Python,Pandas,Numpy,我正在从无到有地生成一个数据集。 假设我的数据如下所示: Country |Quantity |ProdBatchNo | Volume | Batch_Quantity --------|---------|------------|--------|---------------- Mars | 0 | B9-3 | 1.00 | 6439.849161 Jupiter | 0 | B9-3 | 0.50 | 6439.

我正在从无到有地生成一个数据集。 假设我的数据如下所示:

Country |Quantity |ProdBatchNo | Volume | Batch_Quantity 
--------|---------|------------|--------|----------------
Mars    |     0   | B9-3       | 1.00   | 6439.849161    
Jupiter |     0   | B9-3       | 0.50   | 6439.849161    
Neptune |     0   | B9-3       | 1.25   | 6439.849161       
我想随机为每个国家分配一个产品数量,然后计算该国家分配到的批次数量的总百分比。 我能想到的唯一方法是将6439/3=(2146)除以,那么数量对于火星为1.00x2146=2146,对于木星为0.50x2146=1073,对于海王星为1.25x2146=2682

然而,当我把这些加起来,得到批次的总百分比时,这些数字加起来就不一样了。火星占33%,木星占16%,海王星占41%。这使总数达到90%,但我希望批次数量完全分配给这些国家,没有剩余

我意识到这既是一个数学问题,也是一个数据问题,很难解释我在做什么,因为我自己生成了这个数据集,所以分配给一个国家的ProdBatchNo数量可以是完全随机的,只要所有批次数量都在国家之间分配

在ProdBatchNo出现重复行之前,我的方法很简单——我将Batch_数量四舍五入到最接近的100,然后除以体积(容器大小)生成数量。但是,我想根据数量将总批次数量分为3个产品批次,并将它们分配给我假设的国家火星、木星和海王星,同时生成分配给每个ProdBatchNo(总批次数量)的%\u Vol\u

对不起,我不是很擅长解释我在寻找什么。 有人跟踪我吗? 谢谢:)

现在
%\u分配的
新数量
约为100% 在列
['New_Quantity']
中,您可以看到更新的值

现在
%\u分配的
新数量
约为100% 在列
['New_Quantity']
中,您可以看到更新的值这是一个简单的比例除法。您希望影响每个国家/地区的批数量的一部分:

  • 单个数量之和必须等于
    批次数量
  • 单个数量必须与体积成比例
就这么做吧:

df['%_Vol_allocated'] = (df.Volume / df.Volume.sum()) * 100
df['Quantity'] = df.Batch_Quantity * df['%_Vol_allocated'] / 100
这假设数据帧中只有一个批次。如果您可以有多个,您可以在
ProdBatchNo
上进行分组:

for _, sub in df.groupby('ProdBatchNo'):
    df.loc[sub.index, '%_Vol_allocated'] = sub.Volume / sub.Volume.sum() * 100
    df.loc[sub.index, 'Quantity'] = sub.Batch_Quantity * sub['%_Vol_allocated'] / 100
这是一个简单的比例除法。您希望影响每个国家/地区的批数量的一部分:

  • 单个数量之和必须等于
    批次数量
  • 单个数量必须与体积成比例
就这么做吧:

df['%_Vol_allocated'] = (df.Volume / df.Volume.sum()) * 100
df['Quantity'] = df.Batch_Quantity * df['%_Vol_allocated'] / 100
这假设数据帧中只有一个批次。如果您可以有多个,您可以在
ProdBatchNo
上进行分组:

for _, sub in df.groupby('ProdBatchNo'):
    df.loc[sub.index, '%_Vol_allocated'] = sub.Volume / sub.Volume.sum() * 100
    df.loc[sub.index, 'Quantity'] = sub.Batch_Quantity * sub['%_Vol_allocated'] / 100

嘿,你是如何得到火星的2750数量的?,“将批次数量四舍五入到最接近的100,然后除以体积”6400*1=?是的,它们只是占位符。我删除了Mok所以现在,你需要向我们展示,你对结果数据框的预期,用你的预期结果替换“?”,在编辑后查看我的答案。看看我的答案,对你来说可以吗?嘿,你是如何得到mars的数量2750的?,“将批次数量四舍五入到最接近的100,然后除以体积" 6400 * 1 = .. ?是的,它们只是占位符。我删除了它们,所以现在,您需要向我们展示,您期望的结果是什么dataframe,replace“?'根据您的预期结果,请在编辑后查看我的答案。请查看我的答案,对您合适吗?谢谢,我想我可以通过某种方式调整此答案,以将其应用于具有不同ProdBatchNo的重复行”s@skiventist好的,现在看一下,我已经将数量之和()的差值除以批次数量,并添加到新的_quantityThank中,我想我可以以某种方式调整此答案,将其应用于具有不同ProdBatchNo'的重复行s@skiventist好的,现在看一下,我已经将数量之和()的差值除以批次数量,并添加到新数量中