gpt4 book ai didi

python - Pandas :从第二行开始。从上一行中减去并将其用作下一次减法的值

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:19 24 4
gpt4 key购买 nike

上下文

我需要使用 Pandas 编写一个算法,从第二行开始,从上一行减去一个列值,然后使用结果继续减去下一行,等等。

例子

INPUT:
ID VALUE
0 1
1 10
2 30
3 45
4 78

OUTPUT (just the result, not the operation itself):
ID VALUE
0 1
1 9 #(10-1)
2 21 #(30-9)
3 24 #(45-21)
4 54 #(78-24)

我尝试了什么

df['VALUE'] = df['VALUE'] - df['VALUE]'.shift() # Doesn't starts with the second row, and use the original dataframe to subtract

df['VALUE'] = df['VALUE'].diff() # Doesn't starts with the second row, and use the original dataframe to subtract

最佳答案

Numpy,cumsum 交替符号

i = np.arange(len(df))
j = np.arange(2)

a = np.where(
(i[:, None] + j) % 2 == 0, 1, -1
) * df.VALUE.values[:, None]

b = a.cumsum(0)[i, i % 2]

df.assign(VALUE=b)

ID VALUE
0 0 1
1 1 9
2 2 21
3 3 24
4 4 54

说明

首先要注意的是

X0 ->                     X0
X1 -> X1 - X0
X2 -> X2 - X1 + X0
X3 -> X3 - X2 + X1 - X0
X4 -> X4 - X3 + X2 - X1 + X0

所以我想每隔一行乘以一个负数......但是我需要为交替行的其他选择执行两次。

我需要为两个选项生成一个在 + 和 - 1 之间交换的掩码

i = np.arange(len(df))
j = np.arange(2)

m = np.where(
(i[:, None] + j) % 2 == 0, 1, -1
)

m

array([[ 1, -1],
[-1, 1],
[ 1, -1],
[-1, 1],
[ 1, -1]])

现在我需要在我的 df.VALUE

中广播乘法
a = m * df.VALUE.values[:, None]

a

array([[ 1, -1],
[-10, 10],
[ 30, -30],
[-45, 45],
[ 78, -78]])

注意模式。现在我 cumsum

a.cumsum(0)

array([[ 1, -1],
[ -9, 9],
[ 21, -21],
[-24, 24],
[ 54, -54]])

但我需要积极的……更具体地说,我需要交替的。所以我用修改后的 arange

切片
b = a.cumsum(0)[i, i % 2]
b

array([ 1, 9, 21, 24, 54])

这是我最终分配给现有列的内容

df.assign(VALUE=b)

ID VALUE
0 0 1
1 1 9
2 2 21
3 3 24
4 4 54

这会生成 df 的副本并用 b 覆盖 VALUE 列。
要保留此答案,请确保重新分配新名称或 df(如果需要)。

df_new = df.assign(VALUE=b)

关于python - Pandas :从第二行开始。从上一行中减去并将其用作下一次减法的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52296536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com