我有一个数据框,其值分布在几列上。我想计算特定列中所有项目的平均值。
我查找的所有解决方案最终都给了我每列的平均值或所选列的平均值。
例如我的数据框看起来像这样:
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中做到这一点?
答案 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)
可以groupby
至sum
的所有值并获得它们各自的大小。然后,除以得到均值。
这样,您就可以一次获得所有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_index
和stack
并直接mean
df.set_index('Name')[['b','c']].stack().mean(level=0)
Out[117]:
Name
Alice 3.500000
Ben 1.833333
dtype: float64