使用前一组行在数据帧组中分配值



考虑以下数据帧:

A |  B |  C
_____________
a |  1 |  1
a |  5 |  NaN
b |  3 |  1
b |  4 |  NaN
c |  2 |  1
c |  2 |  NaN
a |  1 |  NaN
b |  3 |  NaN
c |  4 |  NaN

我的目标是根据一条规则更新C列,该规则还包括每个组的前一行。举个例子,如果B列的值小于前一列的值,则C的值应该为0,否则保持前一列C的值。

因此,这将给我以下信息:

A |  B |  C
_____________
a |  1 |  1
a |  5 |  1
b |  3 |  1
b |  4 |  1
c |  2 |  1
c |  2 |  1
a |  1 |  0
b |  3 |  0
c |  4 |  1

我想用一种

df.groupby(A).apply(lambda x: x['C'].shift(1) if x['B'].shift(1) >= x['B'] else 0)

但显然这不起作用,因为应用程序无法访问以前的行(我认为(

如果全部失败,我会从每个组中构建单独的DF,并对其进行单独的修改,这样就不会在结果中包含另一组的行,但我相信必须有一个使用原始数据帧的更优雅的解决方案。

有什么建议吗?

尝试:

import numpy as np
def fill(x):
x['C'] = x['C'].fillna(method='ffill')
x['C'] = np.where(x['B'].values <= x['B'].shift(1).values, 0, x['C'])
return x
df = df.groupby('A').apply(fill)

这里的想法是,首先用以前的值填充NAN值,然后在满足条件的情况下用0替换该值。

最新更新