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

标签 python pandas group-by

考虑以下数据框:

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/

相关文章:

python - Lambda 包括 if...elif...else

python - CMAKE 3.9.3 找不到 Boost1.65.1 Boost_Python

Python pandas - 如何访问 stats ols 的参数?

python - 带有 pandas 的多个堆叠条形图

Python 在数据框中用 True 和 False 替换 1.0 和 0.0

python - 在夹层指标变量之间对 Pandas DataFrame 行进行高效分区

mysql - 使用特定的 MAX(field) 分组后返回记录

python - "How to Fix:TypeError __init() got an unexpected keyword argument ' max_value' 与进度条相关

mysql - 查询中的 GROUP BY

python - 基于 Pandas DataFrame 中两行之间的斜率的条件