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

Har*_*gal 51 python dataframe pandas

我有一个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
Run Code Online (Sandbox Code Playgroud)

我的目标是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
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

The*_*Cat 104

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

df.astype(bool).sum(axis=0)
Run Code Online (Sandbox Code Playgroud)

对于每行中使用的非零数

df.astype(bool).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

(感谢Skulas)

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

df.fillna(0).astype(bool).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

(感谢SirC)

  • 我认为你的意思是 axis=0 。如果你做 axis=1 你会计算非零**行** (2认同)
  • 如果你的数据框中有nan,那么它们就会有所帮助. (2认同)

Sar*_*rah 21

为什么不使用np.count_nonzero

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

它也适用于日期。

  • 感谢您的回答!我最终得到了这个解决方案,因为我认为它非常易于阅读。我只修改了两件事:为了我对“获取所有行的非零值的数量”(您的情况2)的理解,我需要 `axis=1` 而不是 `axis=0`。我更喜欢将输出作为“pandas.Series”,所以我使用了“result = pd.Series(index=df.index, data=np.count_nonzero(df, axis=1))” (4认同)

Bre*_*arn 12

要计算非零值,只需执行(column!=0).sum(),column您要为其执行的数据在哪里. column != 0返回一个布尔数组,True为1,False为0,因此求和会给出与条件匹配的元素数.

为了得到你想要的结果,做

df.groupby('user_id').apply(lambda column: column.sum()/(column != 0).sum())
Run Code Online (Sandbox Code Playgroud)