Как найти количество строк в группе, поскольку для кадра данных pandas возникло ненулевое значение?

У меня есть такой фрейм данных:

ИДЕНТИФИКАТОР ценить А 0 А 1 А 0 А 0 Б 0 Б 0 Б 2 Б 0 Б 4 Б 0

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

ИДЕНТИФИКАТОР ценить num_rows_since_nonzero А 0 0 А 1 0 А 0 1 А 0 2 Б 0 0 Б 0 0 Б 2 0 Б 0 1 Б 4 0 Б 0 1
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете группировать по идентификатору и выполнять собственную функцию подсчета для каждой группы.

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

Scott Boston 26.07.2024 02:37

Другие вопросы по теме