计算熊猫中几列中的项目平均值

时间:2019-08-17 19:01:05

标签: python python-3.x pandas numpy

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

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

例如我的数据框看起来像这样:

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中做到这一点?

3 个答案:

答案 0 :(得分:5)

您可以在这里使用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

答案 1 :(得分:4)

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

这样,您就可以一次获得所有Name的信息。

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。尝试改用NaN,以充分利用向量化操作。

答案 2 :(得分:4)

假设所有列均为数字类型,空格为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