Подсчитайте количество последовательных значений True в столбце, перезапуск при значении False

#python #pandas

Вопрос:

Я работаю со следующей колонкой в pandas df:

 A
True
True
True
False
True
True
 

Я хочу добавить столбец B, который подсчитывает количество последовательных «Истин» в A. Я хочу перезапускаться каждый раз, когда появляется «Ложь». Желаемый результат:

 A      B
True   1
True   2
True   3
False  0
True   1
True   2
 

Комментарии:

1. Пожалуйста, напишите, есть ли у вас какие-либо ошибки в коде или примеры кода, которые вы уже написали?

Ответ №1:

Используя cumsum определение блоков строк , в которых сохраняются значения в столбце A True , затем сгруппируйте столбец A по этим блокам и рассчитайте совокупную сумму для присвоения порядковых номеров

 df['B'] = df['A'].groupby((~df['A']).cumsum()).cumsum()
 

        A  B
0   True  1
1   True  2
2   True  3
3  False  0
4   True  1
5   True  2
 

Комментарии:

1. Даунвотер, мне действительно наплевать на даунвоты, вы можете давать их столько, сколько захотите, но, пожалуйста, не давайте даунвоты новым участникам, это оттолкнет их от участия в SO.

Ответ №2:

Использование простого и родного подхода

(Для небольшого примера кода это сработало нормально)

 import pandas as pd

df = pd.DataFrame({'A': [True, False, True, True, True, False, True, True]})

class ToNums:
  counter = 0
  @staticmethod
  def convert(bool_val):
    if bool_val:
      ToNums.counter  = 1
    else:
      ToNums.counter = 0
    return ToNums.counter

df['B'] = df.A.map(ToNums.convert)

df
 
      A      B
0   True    1
1   False   0
2   True    1
3   True    2
4   True    3
5   False   0
6   True    1
7   True    2
 

Комментарии:

1. В последнее время происходят систематические понижения без объяснения причин, у меня самого их было много. Я проголосовал за тебя, чтобы компенсировать это.

2. Это что-то новенькое, я проголосовал за то, чтобы компенсировать вам это, а также @mozway

Ответ №3:

Вот пример

 v=0
for i,val in enumerate(df['A']):
    if val =="True":
        df.loc[i,"C"]= v =v 1
    else:
        df.loc[i,"C"]=v=0
df.head()
 

Это даст желаемый результат

     A        C
0   True     1
1   True     2
2   True     3
3   False    0
4   True     1
 

Ответ №4:

Вы можете использовать комбинацию groupby , cumsum , и cumcount

 df['B'] = (df.groupby((df['A']amp;
                      ~df['A'].shift(1).fillna(False) # row is True and next is False
                     )
                     .cumsum() # make group id
                     )
             .cumcount().add(1) # make cumulated count
             *df['A'] # multiply by 0 where initially False, 1 otherwise
           )
 

выход:

        A  B
0   True  1
1   True  2
2   True  3
3  False  0
4   True  1
5   True  2