【问题标题】:Counting non zero values in each column of a DataFrame in python在python中计算DataFrame每一列中的非零值
【发布时间】:2014-11-21 03:03:58
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

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

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


    对于 OP 的目标,我们可以将 0 替换为 NaN 并使用 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
    

    【讨论】:

      【解决方案2】:

      为什么不使用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))
      【解决方案3】:

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

      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)

      【讨论】:

      • 我认为您的意思是axis = 0。如果您执行axis=1,您将计算非零
      • @skulas 好收获!我想大多数人都来这里排队,这就是为什么以前没有人抱怨过:)
      • 那是一个伟大的班轮!获取所有不为空的列值
      • @Amir 日期类型会永远为零吗?
      • 如果你的数据框中有 nan 是很危险的,它们会对总和有所贡献。
      【解决方案4】:

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

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

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

      【讨论】:

      • @BrenBram 如果我们在某些单元格中有负值​​,应该采取什么方法?
      • @HarshSingal:column != 0 将找到所有不为零的值,无论它们是正数还是负数。
      • 很抱歉没有准确地说明问题。当我实现上述方法时,SUM(Tags) 为负的 user_id 在输出中返回 -inf,而正 SUM(Tags) 表现完美。我一直无法弄清楚为什么!
      • @HarshSingal:如果没有非零标签,您可以获得inf(因此非零标签的计数为零)。对于这种情况,您的原始公式没有明确定义,因此您需要考虑您想要的结果。
      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2015-07-10
      • 2011-11-05
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多