考虑以下数据框:
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)
但显然这不起作用,因为 apply 无法访问以前的行(我认为)
如果全部失败,我将从每个组中构建单独的 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 替换该值。
关于python - 使用前一个组行在数据帧组中分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67401334/