Подсчет ненулевых значений в каждом столбце фрейма данных в 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
?
- Чтобы подсчитать количество ненулевых элементов целого кадра данных,
np.count_nonzero(df)
- Подсчитать количество ненулевых всех строк
np.count_nonzero(df, axis=0)
- Подсчитать количество ненулевых всех столбцов
np.count_nonzero(df, axis=1)
Это работает с датами тоже.