2016-12-21 3 views
2

I Have е DataFrame как это:Панды 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 и наоборот

ответ

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 
+0

Я благодарю вас за ответы, но код минимум, работа:. DDF = ДФ [ «Количество»] применяются (roll_count) .where (df ['count'] == False) .dropna() print (max (ddf)) – Andreas

1

Вот уже метод, который принуждают count, чтобы быть целым, а не логическим, добавив 0. Абсолютная разница указывает на изменения в булевом значении, а первое значение заполняется равным 1.

Результат этого изменения Серии оценивается относительно того, будут ли элементы больше 0 в переменной «bools», и выделены соответствующие элементы из df ['count'].

Результаты вектора изменения используются с cumsum для формирования идентификаторов, которые используются в groupby в переменной run. Подсчет каждого идентификатора затем обрабатывается в переменной run.

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 
+0

Благодарю вас за ответы, но минимальный код, который работает:
ddf = df [' count '] применить (roll_count) .where (df [' count '] == False) .dropna()
print (max (ddf)) – Andreas

Смежные вопросы