Python Pandas每行逐个进行条件计算

4

我有一个数据集,其中一列A的值表示得分。

我想计算一列B,以便我可以看到得分与上一行相等或更高的持续时间。

如果该值较低,则将此行中列B的值设置为0。

我尝试了以下方法:

df = pd.DataFrame({'A': [140, 145,148, 150, 100, 105, 106]})

df['B'] = 0
df.loc[df['A'].diff() >= 0, 'B'] = df['B'].shift() + 1

结果如下。
    A       B
0   140     0.0
1   145     1.0
2   148     1.0
3   150     1.0
4   100     0.0
5   105     1.0
6   106     1.0

我知道这个条件是对每一行进行检查,但不幸的是似乎是一起计算的,所以它没有像预期的那样增加值B,因为在对每一行进行计算时,上一行的.shift()的值仍然为0。

我该如何才能得到以下结果?

    A       B
0   140     0
1   145     1
2   148     2
3   150     3
4   100     0
5   105     1
6   106     2

1
这个回答解决了你的问题吗?Python pandas cumsum with reset everytime there is a 0 - G. Anderson
我想到了与@G.Anderson链接类似的解决方案。因此,这个问题可以归为重复:m = df.A.diff().ge(0); df['B'] = m.cumsum() - m.cumsum().where(~m).ffill() - Andy L.
1个回答

3
你需要使用cumsum来识别块,并使用groupby().cumcount()来列举每个块:
s = df['A'].diff().ge(0)
df['B'] = s.groupby((~s).cumsum()).cumcount()

输出:

     A  B
0  140  0
1  145  1
2  148  2
3  150  3
4  100  0
5  105  1
6  106  2

非常感谢!这正是我在寻找的! - fleshstorm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接