我有一个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
任何帮助都应该受到赞赏。
答案 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
?
np.count_nonzero(df)
np.count_nonzero(df, axis=0)
np.count_nonzero(df, axis=1)
它也适用于日期。