【问题标题】:How to get the dynamic cumulative sum in an apply function? [closed]如何在应用函数中获得动态累积和? [关闭]
【发布时间】:2021-03-22 23:30:25
【问题描述】:

采取以下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

如果col_1 == 'A'val_2 > 0,我需要创建一个带有val_2 倒号的新列。这很简单:

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中的增量值,即row(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

【问题讨论】:

标签: python pandas


【解决方案1】:

如果您使用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) 一起放入

【讨论】:

    猜你喜欢
    • 2022-11-28
    • 2012-05-25
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多