gpt4 book ai didi

python - 根据另一列numpy中的阈值和条件计算累积和

转载 作者:行者123 更新时间:2023-12-04 14:55:07 29 4
gpt4 key购买 nike

我有一个数据框,我想根据 2 个条件计算累计和:

  • 第一个是表中已有的 bool 值
  • 和一个检查累计总和的固定阈值。

我在第一或第二方面取得了成功,但我发现很难将两者结合起来。

第一个我用的是groupby

df['group'] = np.cumsum((df['IsSuccess'] != df['IsSuccess'].shift(1)))
df['SumSale'] = df[['Sale', 'group']].groupby('group').cumsum()

对于来自pyfunc的第二个

sumlm = np.frompyfunc(lambda a,b: b if (a+b>5) else a+b, 2, 1)
df['SumSale'] = sumlm.accumulate(df['Sale'], dtype=object)

我的 df 是,SumSale 是我要找的结果。

df2 = pd.DataFrame({'Sale': [10, 2, 2, 1, 3, 2, 1, 3, 5, 5],
'IsSuccess': [False, True, False, False, True, False, True, False, False, False],
'SumSaleExpected': [10, 12, 2, 3, 6, 2, 3, 6, 11, 16]})

总而言之,一旦总和超过 5 并且 IsSuccess 行为 True,我就开始计算总和。我也想尽可能避免 for 循环。

谢谢你的帮助!

最佳答案

希望我已经正确理解您的问题。当累计销售额大于 5 且 IsSuccess==True 时,此示例将减去必要的值(“重置”):

df["SumSale"] = df["Sale"].cumsum()

# "reset" when SumSale>5 and IsSuccess==True
m = df["SumSale"].gt(5) & df["IsSuccess"].eq(True)
df.loc[m, "to_remove"] = df["SumSale"]
df["to_remove"] = df["to_remove"].ffill().shift().fillna(0)
df["SumSale"] -= df["to_remove"]

df = df.drop(columns="to_remove")

print(df)

打印:

   Sale  IsSuccess  SumSale
0 1 False 1.0
1 2 True 3.0
2 3 False 6.0
3 2 False 8.0
4 4 True 12.0
5 3 False 3.0
6 5 True 8.0
7 5 False 5.0

编辑:

def fn():
sale, success = yield
cum = sale
while True:
sale, success = yield cum
if success and cum > 5:
cum = sale
else:
cum += sale


s = fn()
next(s)
df["ss"] = df["IsSuccess"].shift()
df["SumSale"] = df.apply(lambda x: s.send((x["Sale"], x["ss"])), axis=1)
df = df.drop(columns="ss")
print(df)

打印:

   Sale  IsSuccess  SumSaleExpected  SumSale
0 10 False 10 10
1 2 True 12 12
2 2 False 2 2
3 1 False 3 3
4 3 True 6 6
5 2 False 2 2
6 1 True 3 3
7 3 False 6 6
8 5 False 11 11
9 5 False 16 16

关于python - 根据另一列numpy中的阈值和条件计算累积和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68209418/

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