我正在尝试使用 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),因此在任何行上输出时,累积和最多只能对 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"]
但它并没有接近正确的答案,无法想象如何在不迭代的情况下获得这样的结果以产生所需的输出。
代码
df["desired_output"] = df.pivot(columns='id', values='value').ffill().sum(axis=1).astype('int')
df:
id value desired_output
0 a 12 12
1 b 14 26
2 c 3 29
3 a 13 30
4 b 16 32
5 e 7 39
6 f 4 43
7 a 6 36
8 b 10 30
9 k 18 48