首页 文章

累积总和达到阈值

提问于
浏览
1

我有一个两列pandas DataFrame,看起来如下所示:

import pandas as pd
df = pd.DataFrame([[5,100],[6,200],[7,250],[8,1000]],columns=['Price','Units'])

给定一个阈值,比如1500,我想取两列产品的累积和(直到总数达到1500的阈值)并除以'单位'列的累积总和,使得累积总和只能达到1500.我可以使用for循环实现这个,但熊猫怎么做呢?

详细说明一下:

df['Product'] = df.prod(axis=1)
df['CumSum'] = df['Product'].cumsum()

在index = 1时,累积和超过阈值(1700> 1500) . 然后,我们只想获得达到阈值的单位数 . 例如,结果将是df:

Price   Units  Product  CumSum  CumSumWithThreshold
  5       100     500     500          500
  6       200    1200    1700         1500
  7       250    1750    3450            0
  8      1000    8000   11450            0

鉴于你有1500美元的花费,每单位的平均价格是多少?在上面,您可以支付100个单位,价格为5美元(总计500美元)和(1000/6)单位价格6美元(此价格总计1000美元) . 因此,每单位的平均价格是:1500美元/(100(1000/6))= 5.625美元......

2 回答

  • 1

    我假设这是你尝试过的for循环的类型,但这不需要在终止行之外进行任何计算 .

    import pandas as pd
    df = pd.DataFrame([[5,100],[6,200],[7,250],[8,1000]],columns=['Price','Units'])
    
    def average_price_to_buy_thresh(df, thresh):
        total = thresh
        units = 0
        for i, (px, amt) in df.iterrows():
            prod = px*amt
            if prod<total:
                units += amt
                total -= prod
            else:
                units += total/px
                return (thresh/units)
    
    print('Result: $%.2f' % average_price_to_buy_thresh(df, 1500))
    
  • 1

    我已经能够接近,但也许不是熊猫会做的事情 . 也许这个答案会渗透更多的创造力:

    import pandas as pd
    import numpy as np
    
    Threshold = 1500
    df = pd.DataFrame([[5,100],[6,200],[7,250],[8,1000]],columns=['Price','Units'])
    
    df['Diff'] = df.prod(axis=1).cumsum() - Threshold
    df['ThisUnits'] = df.apply(lambda x: x['Units'] if x['Diff']<0 else np.max([0,x['Units'] - x['Diff']/x['Price']]),axis=1)
    print('Result: $%.2f' % (Threshold/df['ThisUnits'].sum()))
    

    还有其他想法吗?

相关问题