Pandas数据帧:计算最大连续值

时间:2016-12-21 20:24:09

标签: pandas count

我有这样的DataFrame:

RTD  Val   
BA    2    
BA    88    
BA    15
BA    67    
BA    83   
BA    77  
BA    79  
BA    90   
BA    1   
BA    14   

第一:

df['count'] = df.Val > 15
print(df) 

我得到了结果:

  RTD  Val  count
0  BA    2  False
1  BA   88  True
2  BA   15  False
3  BA   67  True
4  BA   83  True
5  BA   77  True
6  BA   79  True
7  BA   90  True
8  BA    1  False
9  BA   14  False

现在,要计算我使用的最大连续次数:

def rolling_count(val):
    if val == rolling_count.previous:
        rolling_count.count +=1
    else:
        rolling_count.previous = val
        rolling_count.count = 1
    return rolling_count.count
rolling_count.count = 0 #static variable
rolling_count.previous = None #static variable

ddf= df['count'].apply(rolling_count)
print (max(ddf))

我得到结果:5

我的回答是: 要计算连续出现的最大值False,我该怎么做?

正确的值等于2

我有兴趣知道Val > 15以外的连续出现次数的最大值,反之亦然

2 个答案:

答案 0 :(得分:2)

这是一个更长的方法,通过加0来强制count为整数而不是boolean。绝对差异表示布尔值的变化,第一个值填充为1.

此更改的结果系列评估了元素是否在' bools'中大于0。变量和来自df [' count']的相应元素被提取。

更改向量的结果与cumsum一起使用以形成在运行变量中groupby中使用的ID。然后在运行变量中对每个ID的计数进行计算。

countDf = DataFrame({'bools': list(df['count'][(df['count'] + 0)
                       .diff().abs().fillna(1) > 0]),
                     'runs': list(df['Val'].groupby((df['count'] + 0)
                       .diff().abs().fillna(1).cumsum()).count())})

countDf

   bools  runs
0  False     1
1   True     1
2  False     1
3   True     5
4  False     2

您可以使用标准子集(如

)提取最大运行次数
countDf[countDf.bools == False]['runs'].max()
2

countDf[countDf.bools == True]['runs'].max()
5

答案 1 :(得分:1)

这是我的尝试

gt15 = df.Val.gt(15)
counts = df.groupby([gt15, (gt15 != gt15.shift()) \
           .cumsum()]).size().rename_axis(['>15', 'grp'])
counts

>15    grp
False  1      1
       3      1
       5      2
True   2      1
       4      5
dtype: int64
counts.loc[False].max()

2