累积总和达到阈值

时间:2018-01-25 16:27:08

标签: python python-3.x pandas

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

Exception in thread "main" java.lang.NullPointerException
at windows.Title.<init>(Title.java:22)

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

详细说明一下:

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

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

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

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

2 个答案:

答案 0 :(得分: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 :(得分: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()))

还有其他想法吗?