取非零列的平均值

时间:2019-11-12 08:40:00

标签: python pandas numpy

我有一个矩阵-

matrix=[[0,0,1,1],[1,2,0,1],[9,0,1,0],[1,1,2,0]]

我想按列取平均值,但我只想在列中包括非零值。 我使用了以下内容-

array= [float(sum(col))/len(col)  for col in zip(*matrix)]

但是它在第一列中显示2.75,而应该是1 + 9 + 1/3 = 3.6

3 个答案:

答案 0 :(得分:1)

使用numpy:

import numy as np
matrix=np.array([[0,0,1,1],[1,2,0,1],[9,0,1,0],[1,1,2,0]])
array=[np.mean(col[col!=0]) for col in matrix.T]
#array is: [3.6666666666666665, 1.5, 1.3333333333333333, 1.0]

答案 1 :(得分:0)

直接替代您的方法也应该是最快的方法(对于这种大小的问题):

>>> array= [float(sum(col))/sum(map(bool,col))  for col in zip(*matrix)]
>>> array
[3.6666666666666665, 1.5, 1.3333333333333333, 1.0]

编辑:

一种更可靠的方法,处理全零的列:

>>> matrix=[[0,0,1,0],[1,2,0,0],[9,0,1,0],[1,1,2,0]]
>>> array= [float(sum(col))/sum(map(bool,col)) if sum(map(bool,col))>0 else 0 for col in zip(*matrix)]
>>> array
[3.6666666666666665, 1.5, 1.3333333333333333, 0]

答案 2 :(得分:0)

这里是pd.DataFrame().mask的一种方法:

df = pd.DataFrame(matrix)
df.mask(df.eq(0)).mean()

输出:

0    3.666667
1    1.500000
2    1.333333
3    1.000000
dtype: float64