У меня есть такой фрейм данных:
Я хочу добавить столбец, который подсчитывает количество строк с момента появления в группе ненулевого значения (в данном случае ID). Результат будет выглядеть так:






Вы можете группировать по идентификатору и выполнять собственную функцию подсчета для каждой группы.
def calc_nonzeros(grp):
cnt = 0
res = []
for val in grp:
if val != 0:
cnt = 0
res.append(cnt)
cnt += 1
return res
df["num_rows_since_nonzero"] = df.groupby("ID")["value"].transform(
calc_nonzeros
)
Создайте маску, в которой можно проверить, равны ли первые значения группы 0. После этого создайте группы с идентификатором столбца и значениями из столбца «значение», превышающими 0. Используйте маску, чтобы заменить значения, в которых группы имеют 0 в качестве первого значения.
m = df.groupby('ID')['value'].cumsum().gt(0)
g = df['value'].gt(0)
df['rows_since_zero'] = df.groupby(['ID', g.cumsum()]).cumcount().where(m, 0)
ID value rows_since_zero
A 0 0
A 1 0
A 0 1
A 0 2
B 0 0
B 0 0
B 2 0
B 0 1
B 4 0
B 0 1
хороший! Отличная логика. +1