在python中计算数据帧的每一列中的非零值

时间:2014-09-26 07:04:13

标签: python pandas dataframe

我有一个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

我的目标是为每个user_id

实现Sum(Tag)/Count(NonZero(Tags))

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

任何帮助都应该受到赞赏。

3 个答案:

答案 0 :(得分:87)

我最喜欢的每列中获得非零数的方法是

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

对于每行中的非零数,请使用

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

(感谢Skulas)

如果你的df中有nans,你应该先将它们设为零,否则它们将被计为1。

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

(感谢SirC)

答案 1 :(得分:10)

要计算非零值,只需执行(column!=0).sum(),其中column是您要为其执行的数据。 column != 0返回一个布尔数组,True为1,False为0,因此对此求和可以得到符合条件的元素数。

为了获得理想的结果,请执行

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

答案 2 :(得分:2)

为什么不使用np.count_nonzero

  1. 要计算整个数据帧的非零数,np.count_nonzero(df)
  2. 计算所有行的非零数 np.count_nonzero(df, axis=0)
  3. 计算所有列的非零数 np.count_nonzero(df, axis=1)

它也适用于日期。