#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