79

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

任何帮助将不胜感激。

4

4 回答 4

147

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

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

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

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

(感谢 Skulas)

如果您的 df 中有 nan,则应首先将它们设为零,否则它们将被计为 1。

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

(感谢 SirC)

于 2015-12-08T12:39:13.147 回答
25

为什么不使用np.count_nonzero

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

它也适用于日期。

于 2019-10-11T18:04:22.327 回答
13

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

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

df.groupby('user_id').apply(lambda column: column.sum()/(column != 0).sum())
于 2014-09-26T07:06:56.110 回答
0

我知道这个问题很老,但似乎 OP 的目标与问题标题不同:

我的目标是为每个 user_id 实现 Sum(Tag)/Count(NonZero(Tags)) ...


对于 OP 的目标,我们可以用 NaN 替换 0 并使用groupby+ mean(这是因为mean默认跳过 NaN):

out = df.replace(0, np.nan).groupby('UserId', as_index=False).mean()

输出:

    UserId  Tag_0  Tag_1
0  7867688    3.5  3.875
于 2022-02-19T07:00:33.400 回答