如何在应用函数中获得动态累积和?

2024-09-30 16:37:38 发布

您现在位置:Python中文网/ 问答频道 /正文

以下面的df为例:

df = pd.DataFrame({'col_1':['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
                   'val_1':[10, 20, 15, 25, 20, 15, 20, 30, 40],
                   'val_2':[-5, 0, 5, 10, 5, 10, 15, 10, 5]})

  col_1  val_1  val_2
0     A     10     -5
1     B     20      0
2     C     15      5
3     A     25     10
4     B     20      5
5     C     15     10
6     A     20     15
7     B     30     10
8     C     40      5

我需要创建一个新的列,其倒号为val_2,ifcol_1 == 'A'和ifval_2 > 0。这很简单:

df['new_col'] = df.apply(lambda x: -x.val_2 if x.col_1 == 'A' and x.val_2 > 0 else 0, axis=1)

  col_1  val_1  val_2  new_col
0     A     10     -5        0
1     B     20      0        0
2     C     15      5        0
3     A     25     10      -10
4     B     20      5        0
5     C     15     10        0
6     A     20     15      -15
7     B     30     10        0
8     C     40      5        0

但我的最终目标只是得到new_col中的增量值,即行(n)的值减去上述行的累积和

结果df应该如下所示:

  col_1  val_1  val_2  new_col
0     A     10     -5        0
1     B     20      0        0
2     C     15      5        0
3     A     25     10      -10
4     B     20      5        0
5     C     15     10        0
6     A     20     15       -5 --> -15 - (-10) --> (-10 is the cumsum of previous rows)
7     B     30     10        0
8     C     40      5        0

Tags: andlambdadataframedfnewifcolval
1条回答
网友
1楼 · 发布于 2024-09-30 16:37:38

如果使用NaN而不是0,事情会变得更容易

cond = (df.col_1 == 'A') & (df.val_2 > 0)
df.loc[ cond, 'new_col' ] = -df.loc[ cond, 'val_2' ]


>>> df
  col_1  val_1  val_2  new_col
0     A     10     -5      NaN
1     B     20      0      NaN
2     C     15      5      NaN
3     A     25     10    -10.0
4     B     20      5      NaN
5     C     15     10      NaN
6     A     20     15    -15.0
7     B     30     10      NaN
8     C     40      5      NaN

您可以dropna()只保留值

>>> df.new_col.dropna().diff()
3    NaN
6   -5.0
Name: new_col, dtype: float64

您可以将其传递到.update()

df.update(df.new_col.dropna().diff())

>>> df
  col_1  val_1  val_2  new_col
0     A     10     -5      NaN
1     B     20      0      NaN
2     C     15      5      NaN
3     A     25     10    -10.0
4     B     20      5      NaN
5     C     15     10      NaN
6     A     20     15     -5.0
7     B     30     10      NaN
8     C     40      5      NaN

然后将0.fillna(0)放在一起

相关问题 更多 >