gpt4 book ai didi

python - 添加超范围;如何?

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:15 25 4
gpt4 key购买 nike

这似乎是一项简单的任务,但我就是做不对!

从示例数据中,我需要对每个范围进行推导(实际数据集中可能有很多范围)。

我已经写了一个例子来展示正确的计算方法。在底部的表格中,我包含了所需的结果。

逻辑是 Jade 米1到10减5.29,11到20减(7.37+2.9)。

相同的逻辑适用于“apple”,但 from-to 的结构略有不同,即从 1-20 到 11-20。当数量 <=10 时扣减 5.31,如果数量为 11-15,折扣必须加在一起 ​​(5.31+2.34)。范围可以重叠,例如如果数量为 17,则适用 1-20、10-20 和 15-25 的扣除。

非常感谢任何帮助!

示例数据:

candy   qty_from    qty_to  reason  deduction
corn 1 10 smell -5.29
corn 10 20 smell -7.37
corn 10 20 work -2.90
apple 1 20 smell -5.31
apple 10 20 work -2.34
apple 15 25 smell -1.00
apple 75 110 work -2.00

data = {'candy':['corn','corn','corn','apple','apple','apple','apple'],
'qty_from':[1,10,10,1,10,15,75],
'qty_to':[10,20,20,20,20,25,110],
'reason':['smell','smell','work','smell','work','smell','work'],
'deduction':[-5.29,-7.37,-2.9,-5.31,-2.34,-1,-2]}

df = pd.DataFrame(data)

想要的结果示例:

candy   range   deduction
corn 1-10 -5.29
corn 10-20 -10.27
apple 1-10 -5.31
apple 10-15 -7.65
apple 15-20 -8.65
apple 20-25 -1.00
apple 75-110 -2.00

result_data =
{'candy':'corn','corn','apple','apple','apple','apple','apple'],
'range':['1-10','10-20','1-10','10-15','15-20','20-25','75-110'],
'deduction':[-5.29,-10.27,-5.31,-7.65,-8.65,-1,-2]}

results = pd.DataFrame(result_data)

编辑,为什么 groupby 不起作用:

pd.DataFrame(df.groupby(['candy','qty_from','qty_to'])['deduction'].sum())


candy qty_from qty_to deduction
apple 1 20 -5.31
10 20 -2.34
15 25 -1.00
75 110 -2.00
corn 1 10 -5.29
10 20 -10.27

例如苹果 10-20 的值不正确!

最佳答案

现在的问题可以用pd.IntervalIndex解决:

# get list of all the thresholds
thresh = sorted(set(df[['qty_from', 'qty_to']].values.ravel()))

# all cuts
cuts = pd.IntervalIndex.from_arrays(thresh[:-1], thresh[1:])

# intervals of the quantities
intervals = pd.IntervalIndex.from_tuples([(a,b) for a,b in zip(df.qty_from, df.qty_to)] )

# overlapings
intersects = pd.DataFrame([[t.overlaps(i) for i in intervals] for t in cuts],
index=cuts,
columns=df.index)
# get the sum:
intersects.mul(df.deduction).groupby(df.candy, axis=1).sum().unstack()

输出:

candy          
apple (1, 10] -5.31
(10, 20] -7.65
corn (1, 10] -5.29
(10, 20] -10.27
dtype: float64

更新:您可以使用自定义函数代替 t.overlaps(i):

def overlaps(t,i):
endpoints = (t.left, t.right, i.left, i.right)
l,r = min(endpoints), max(endpoints)

return (r-l < (t.length) + (i.length))

关于python - 添加超范围;如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56903491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com