当前位置: 首页 > 知识库问答 >
问题:

将负行值与前几行相加

蒯宇定
2023-03-14

我很难找到一个好方法来找到一列中的所有负条目,并将它们向上移动,与现有条目相加(即从当前条目中减去负条目),直到所有值都为正。

重要的是,最终数据帧没有负值

根据此处已提供的表格:

出席:

渴望的:

共有2个答案

须鸿祯
2023-03-14

值数组上的直接递归函数

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
易英奕
2023-03-14

您可以在创建组后尝试反向求和,然后屏蔽:

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
 类似资料:
  • 我可以将指向结构的指针类型转换为带符号的值以返回不同类型的错误吗。C标准是否允许这种行为,或者是一种未定义的行为。 我怎样才能让这个条件起作用?

  • 问题内容: 我正在Linux上工作。我有2个文件-file1.dat和file2.dat。 对于file2: 我想用file2.dat的前3行替换file1.dat的前4行。所以我的输出如下 我尝试了以下输入: 但是使用此输入,我有以下输出: 我应该如何修改输入命令?我尝试了各种组合。 问题答案: 是你的朋友 脚本 输出量 提示 NR-已处理的记录总数 FNR-处理的记录总数,但在读取新文件时会重

  • 在我的代码中, 与负零相比 结果将为true。 但是 与负零相比 此外,结果将为true,而不是false 为什么这两种情况的结果都是真的? 这里有一个MCVE来测试它(在coliru上直播): 输出:

  • 这个问题类似于我在这里发现的:将一个数据框中的行(带有行名)与另一个数据框中匹配的列名相乘 但是不是匹配行和乘法,我想将df1中的列值与df2中的列名匹配,并在新的df3中返回df2的相应行值。 这就是我想要的: 在我的实际 df1 和 df2 中有 64 行,其中 df1 中的“V1”对应于 df2 中“name”列的数字索引。在我的df2中,有22列,即一列带有“名称”,另一列21列带有“X

  • 问题内容: 我有一个列的表,让我们把它称为是目前该表中的所有行。我想将所有行的值插入该列。有人可以给我这个SQL吗? 我已经尝试过了,但这仅填充了最后一行。如何一次完成所有行? 问题答案: 您正在寻找UPDATE not insert。 UPDATE将更改现有行的值(并且可以包含WHERE以使其仅影响特定行),而INSERT将添加新行(这使其看起来仅更改了最后一行,但实际上是添加了新行)具有该值的

  • 我使用键和构建以下面板数据: 让我们假设2018年发生了一次冲击。我希望通过对上一行和下一行进行切片,这些行的值与shock行的值相同。 我举几个例子来说明。对于,数据集如下所示: 2018年的