【问题标题】:Calculating mean value of item in several columns in pandas计算熊猫中几列项目的平均值
【发布时间】:2019-12-23 15:13:21
【问题描述】:

我有一个数据框,其值分布在几列中。我想计算特定列中所有项目的平均值。

我查找的所有解决方案最终都会给我每列的单独平均值或所选列的平均值。

例如我的数据框如下所示:

Name    a   b   c   d
Alice   1   2   3   4
Alice   2       4   2
Alice   3           2
Alice   1       5   2
Ben     3   3   1   3
Ben     4   1   2   3
Ben     1   2   2   

我想查看每个“爱丽丝”的 b 和 c 列中的值的平均值:

当我尝试时:

df[df["Name"]=="Alice"][["b","c"]].mean()

结果是:

b    2.00
c    4.00
dtype: float64

在另一篇文章中,我发现了一个建议,即为每个轴尝试一次“双”意味着一次,例如:

df[df["Name"]=="Alice"][["b","c"]].mean(axis=1).mean()

但结果是:

3.00

这是两列的平均值。

我期待一种计算方法: (2 + 3 + 4 + 5) / 4 = 3.50

有没有办法在 Python 中做到这一点?

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    您可以在此处使用 numpy 的 np.nanmean [numpy-doc],这只会将您的数据框部分视为一个数组,并默认计算整个部分的平均值:

    >>> np.nanmean(df.loc[df['Name'] == 'Alice', ['b', 'c']])
    3.5
    

    或者如果你想按名称分组,你可以先堆叠数据框,比如:

    >>> df[['Name','b','c']].set_index('Name').stack().reset_index().groupby('Name').agg('mean')
                  0
    Name           
    Alice  3.500000
    Ben    1.833333
    

    【讨论】:

      【解决方案2】:

      可以groupbysum 的所有值并获得它们各自的大小。然后,除以得到平均值。

      这样您就可以一次获得所有Names。

      g = df.groupby('Name')[['b', 'c']]
      g.sum().sum(1)/g.count().sum(1)
      

      Name
      Alice    3.500000
      Ben      1.833333
      dtype: float64
      

      PS:在您的示例中,您的某些单元格中似乎有空字符串。这是不可取的,因为您的列会将dtypes 设置为object。尝试改用NaNs,以充分利用矢量化操作。

      【讨论】:

        【解决方案3】:

        假设所有列都是数字类型,空格是NaN。一个简单的set_indexstack 和直接mean

        df.set_index('Name')[['b','c']].stack().mean(level=0)
        
        Out[117]:
        Name
        Alice    3.500000
        Ben      1.833333
        dtype: float64
        

        【讨论】:

          猜你喜欢
          • 2020-04-18
          • 2021-02-27
          • 1970-01-01
          • 1970-01-01
          • 2022-11-14
          • 1970-01-01
          • 1970-01-01
          • 2018-06-23
          相关资源
          最近更新 更多