首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算自条件为true以来上面的行数

计算自条件为true以来上面的行数
EN

Stack Overflow用户
提问于 2021-05-03 15:20:00
回答 2查看 59关注 0票数 1

假设我有一个包含一些整数的df:

mdf = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), columns=list('A'))

以及它们的条件:

mdf['CM'] = mdf['A'] > mdf['A'].shift(5)

既然条件为真,那么计算当前行数的最有效方法是什么?

应该是这样的:

代码语言:javascript
复制
def some_function(df):
  """
  Here is calculated nearest row index from current where the condition was met
  """
  return integer_value of None

mdf['SINCE'] = some_function(mdf)

UPD。df应该是这样的:

代码语言:javascript
复制
Idx  A    CM    SINCE   Formula
0   23  False   None    
1   55  False   None    
2   48  False   None    
3   17  False   None    
4   24   True   0       4-4
5   30  False   1       5-4
6   99   True   0       6-6
7   11  False   1       7-6
8   47   True   0       8-8
9   25  False   1       9-8
10  78  False   2       10-8
11  40   True   0       11-11
12  99   True   0       12-12
13  7   False   1       13-12
14  6   False   2       14-12
15  64   True   0       15-15
16  62  False   1       16-15
17  39   True   0       17-17
18  41   True   0       18-18
19  28  False   1       19-18
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 15:25:09

使用:

代码语言:javascript
复制
s = mdf['CM'].cumsum()
mdf["SINCE"] = mdf[s.gt(0)].groupby(s).cumcount()

print (mdf)
      A     CM  SINCE Formula
Idx                          
0    23  False    NaN     NaN
1    55  False    NaN     NaN
2    48  False    NaN     NaN
3    17  False    NaN     NaN
4    24   True    0.0     4-4
5    30  False    1.0     5-4
6    99   True    0.0     6-6
7    11  False    1.0     7-6
8    47   True    0.0     8-8
9    25  False    1.0     9-8
10   78  False    2.0    10-8
11   40   True    0.0   11-11
12   99   True    0.0   12-12
13    7  False    1.0   13-12
14    6  False    2.0   14-12
15   64   True    0.0   15-15
16   62  False    1.0   16-15
17   39   True    0.0   17-17
18   41   True    0.0   18-18
19   28  False    1.0   19-18
票数 1
EN

Stack Overflow用户

发布于 2021-05-03 15:54:36

您可以尝试使用累积和:

代码语言:javascript
复制
cs = mdf.CM.cumsum()
mdf["SINCE"] = mdf.groupby(cs).cumcount()

# Nonify the values up until first True
mdf.loc[cs == 0, "SINCE"] = np.nan

获取(对于30个样本数据):

代码语言:javascript
复制
     A     CM  SINCE
0   79  False    NaN
1   46  False    NaN
2   59  False    NaN
3   31  False    NaN
4   72  False    NaN
5   34  False    NaN
6   42  False    NaN
7   40  False    NaN
8   82   True    0.0
9   16  False    1.0
10   9  False    2.0
11  45   True    0.0
12  68   True    0.0
13  48  False    1.0
14  20   True    0.0
15   9  False    1.0
16  14  False    2.0
17  91   True    0.0
18  92   True    0.0
19   0  False    1.0
20  93   True    0.0
21   1  False    1.0
22  60  False    2.0
23   0  False    3.0
24  93   True    0.0
25  85  False    1.0
26  52   True    0.0
27  32  False    1.0
28  65   True    0.0
29  85  False    1.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67364920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档