如何执行 pandas cumsum,同时跳过在另一个字段中重复的行

问题描述 投票:0回答:1

我正在尝试使用 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"]

但它并没有接近正确的答案,无法想象如何在不迭代的情况下获得这样的结果以产生所需的输出。

python pandas dataframe duplicates cumsum
1个回答
0
投票

代码

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
© www.soinside.com 2019 - 2024. All rights reserved.