考虑以下数据帧:
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替换该值。