pandas 如何从上一行中依次减去 Dataframe 中的值?

b91juud3  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(183)

假设我有一个数据框,如下所示:

col1 col2
0    10
1    23
2    21
3    15

我想按顺序将col2中的每个值与前一行相减,这样我们就可以减去前一个相减的值,得到:

col1 col2
0    10 # left unchanged as index == 0
1    13 # 23 - 10
2    8  # 21 - 13
3    7  # 15 - 8

我发现的其他解决方案都是按原样减去以前的值,而不是减去新的值。我希望避免使用for循环,因为我有一个非常大的数据集。

0sgqnhkj

0sgqnhkj1#

试从下面来理解“前减”

b2 = a2 - a1
b3 = a3 - b2 = a3 - a2 + a1
b4 = a4 - b3 = a4 - a3 + a2 - a1
b5 = a5 - b4 = a5 - a4 + a3 - a2 + a1

所以我们就这么做了

s = np.arange(len(df))%2
s = s + s - 1
df['new'] = np.tril(np.multiply.outer(s,s)).dot(df.col2)
Out[47]: array([10, 13,  8,  7])
tpgth1q7

tpgth1q72#

下面是一个简单的纯Pandas(不需要导入numpy)方法,这是一个更直接的概念,易于从代码中理解,无需额外的解释:
我们首先定义一个函数,它将完成所需的工作:

def ssf(val):
    global last_val
    last_val = val - last_val
    return last_val

使用上面的函数,创建新列的代码将是:

last_val = 0
df['new'] = df.col2.apply(ssf)

让我们比较一下纯Pandas方法与另一个答案中的numpy方法所使用的函数/方法的数量。
Pandas方法使用2个函数/方法:ssf()和.apply()和1操作:简单减法。
numpy方法使用5个函数/方法:.arange()、len()、.tril()、.multiply、.outer()和.dot()以及3操作:数组加法、数组减法和模除法。

相关问题