我正在尝试使用 pandas.cumsum() 函数,但会忽略 ID 列中重复值的行,并且只将最后一个值添加到累计总和中,而忽略所有先前的值。示例代码如下(我无法分享实际代码,仅用于工作)。
import pandas as pd, numpy as np
import random as rand
id = ['a','b','c','a','b','e','f','a','b','k']
value = [12,14,3,13,16,7,4,6,10,18]
df = pd.DataFrame({'id':id, 'value':value})
df["cumsum_of_value"] = df['value'].cumsum()
df["desired_output"] = [
12,26,29,30,32,39,43,36,30,48
]
df["comments"] = [""]*len(df)
df.loc[df.index==0, "comments"]="standard cumsum"
df.loc[df.index==1, "comments"]="standard cumsum"
df.loc[df.index==2, "comments"]="standard cumsum"
df.loc[df.index==3, "comments"]="cumsum of rows 1-3, ignore row 0"
df.loc[df.index==4, "comments"]="cumsum of rows 2-4, ignore rows 0, 1"
df.loc[df.index==5, "comments"]="cumsum of rows 2-5, ignore rows 0, 1"
df.loc[df.index==6, "comments"]="cumsum of rows 2-6, ignore rows 0, 1"
df.loc[df.index==7, "comments"]="cumsum of rows 2,4-7, ignore rows 0, 1, 3"
df.loc[df.index==8, "comments"]="cumsum of rows 2,5-8, ignore rows 0, 1, 3, 4"
df.loc[df.index==9, "comments"]="cumsum of rows 2,5-9, ignore rows 0, 1, 3, 4"
print(df)
在此示例中,ID 列中有七 (7) 个唯一值 (a、b、c、d、e、f、g),因此 cumsum 在任何行上都应该只将最多七 (7) 条记录作为其输出。
是否可以结合使用 cumsum()、groupby()、duplicated()、drop_duplicates() 等函数并避免使用迭代循环来实现?
我已经尝试过以下
df["duped"] = np.where(df["id"].duplicated(keep='last'),0,1)
df["value_duped"] = df["duped"] * df["value"]
df["desired_output_attempt"] = df["cumsum_of_value"] - df["value_duped"]
但它离正确答案还差得很远。我想不出如何在不进行迭代的情况下让这样的结果产生所需的输出。