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

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

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

  1. col1 col2
  2. 0 10
  3. 1 23
  4. 2 21
  5. 3 15

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

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

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

0sgqnhkj

0sgqnhkj1#

试从下面来理解“前减”

  1. b2 = a2 - a1
  2. b3 = a3 - b2 = a3 - a2 + a1
  3. b4 = a4 - b3 = a4 - a3 + a2 - a1
  4. b5 = a5 - b4 = a5 - a4 + a3 - a2 + a1

所以我们就这么做了

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

tpgth1q72#

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

  1. def ssf(val):
  2. global last_val
  3. last_val = val - last_val
  4. return last_val

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

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

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

展开查看全部

相关问题