我有一个两列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美元......
答案 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()))
还有其他想法吗?