2024-10-02 12:36:37 发布
网友
我很难找到一个好方法来找到一列中的所有负条目,并将它们向上移动,与现有条目相加(即从当前条目中减去负条目),直到所有值都为正
重要的是,最终数据帧不存在负值&;所有以前的负数项均为0。此外,该表正在重复,这意味着我需要根据ID和条目(仅对相同ID的条目求和)聚合结果
根据此处已提供的表格:
出席:
期望的:
您可以在创建组后尝试反向求和,然后屏蔽:
s = df['Entries'].gt(0).cumsum() u= df['Entries'][::-1].groupby(s).cumsum().mask(df['Entries'].le(0),0) out = df.assign(New_Entries=u) # you can assign to the original column too.
print(out) ID Date Entries New_Entries 0 1 2013 100 100 1 1 2014 0 0 2 1 2015 60 30 3 1 2016 -30 0 4 1 2017 0 0 5 1 2018 50 30 6 1 2019 0 0 7 1 2020 -20 0 8 2 2013 100 100 9 2 2014 0 0 10 2 2015 60 30 11 2 2016 -30 0 12 2 2017 0 0 13 2 2018 50 30 14 2 2019 0 0 15 2 2020 -20 0
值数组上的一个直接递归函数
df = pd.read_csv(io.StringIO("""ID Date Entries 1 2013 100 1 2014 0 1 2015 60 1 2016 -30 1 2017 0 1 2018 50 1 2019 0 1 2020 -20 2 2013 100 2 2014 0 2 2015 60 2 2016 -30 2 2017 0 2 2018 50 2 2019 0 2 2020 -20"""), sep="\t") def shiftminus(a): touch=False for i,n in enumerate(a): if n<0 and i>0: a[i-1] += a[i] a[i] = 0 touch=True if touch: a = shiftminus(a) return a df["Entries"] = shiftminus(df["Entries"].values)
ID Date Entries 1 2013 100 1 2014 0 1 2015 30 1 2016 0 1 2017 0 1 2018 30 1 2019 0 1 2020 0 2 2013 100 2 2014 0 2 2015 30 2 2016 0 2 2017 0 2 2018 30 2 2019 0 2 2020 0
您可以在创建组后尝试反向求和,然后屏蔽:
值数组上的一个直接递归函数
输出
相关问题 更多 >
编程相关推荐