Подсчет ненулевых значений в каждом столбце фрейма данных в python

У меня есть python- pandas -dataframe, в котором первым столбцом является user_id, а остальные столбцы - это теги (tag_0 - tag_122). У меня есть данные в следующем формате:

UserId  Tag_0   Tag_1
7867688 0   5
7867688 0   3
7867688 3   0
7867688 3.5 3.5
7867688 4   4
7867688 3.5 0

Моя цель - достичь Sum(Tag)/Count(NonZero(Tags)) для каждого user_id

df.groupby('user_id').sum(), дает мне sum(tag), однако я не знаю о подсчете ненулевых значений

Можно ли достичь Sum(Tag)/Count(NonZero(Tags)) по одной команде?

В MySQL я мог бы достичь этого следующим образом: -

select user_id, sum(tag)/count(nullif(tag,0)) from table group by 1

Любая помощь должна быть оценена.

Ответ 1

Мой любимый способ получения числа ненулевых значений в каждом столбце -

df.astype(bool).sum(axis=0)

Для количества ненулевых значений в каждой строке используйте

df.astype(bool).sum(axis=1)

(спасибо Скуласу)

Если в вашей df есть nans, сначала вы должны сделать эти нули, иначе они будут засчитаны как 1.

df.fillna(0).astype(bool).sum(axis=1)

(спасибо SirC)

Ответ 2

Чтобы подсчитать ненулевые значения, просто сделайте (column!=0).sum(), где column - данные, для которых вы хотите сделать это. column != 0 возвращает логический массив, а True - 1, а False - 0, поэтому суммирование приводит к количеству элементов, которые соответствуют условию.

Итак, чтобы получить желаемый результат, сделайте

df.groupby('user_id').apply(lambda column: column.sum()/(column != 0).sum())

Ответ 3

Почему бы не использовать np.count_nonzero?

  1. Чтобы подсчитать количество ненулевых элементов целого кадра данных, np.count_nonzero(df)
  2. Подсчитать количество ненулевых всех строк np.count_nonzero(df, axis=0)
  3. Подсчитать количество ненулевых всех столбцов np.count_nonzero(df, axis=1)

Это работает с датами тоже.