Pandas数据框架,非0值平均数

3

I have the following Pandas Dataframe 'df':

a1  a2  a3  b1
0   0   0   1
1   2   0   2
3   0   0   3
2   4   0   4

如何从a1、a2、a3中获取"a"的平均值,忽略0值?

a1  a2  a3  b1  avg(a)
0   0   0   1   0
1   2   0   2   1.5
3   0   0   3   3.0
2   4   0   4   3.0

我现在使用手动方式将数值>0转换为1,但是遇到了困难。
2个回答

4
你可以像处理列一样.filtera,然后在这些列中.mask零并沿着axis=1.mean
a = df.filter(like='a')
df['avg'] = a.mask(a.eq(0)).mean(1).fillna(0)

# OR df['avg'] = a[a > 0].mean(1).fillna(0)

   a1  a2  a3  b1  avg
0   0   0   0   1  0.0
1   1   2   0   2  1.5
2   3   0   0   3  3.0
3   2   4   0   4  3.0

谢谢,这个可行。 现在如果我有很多平均值,例如a1 a2 a3,b1 b2 b3, 我只需要为这些列创建变量。 - newbs_dasc
@ngakanalit 你能详细说明一下吗?你需要对所有a列求平均值,然后对所有b列求平均值吗? - Shubham Sharma

2
import pandas as pd

df = pd.DataFrame({'a1': [0, 1, 3, 2],
                   'a2': [0, 2, 0, 4],
                   'a3': [0, 0, 0, 0],
                   'b1': [1, 2, 3, 4]})

# remove the last column
df1 = df.drop('b1', 1)

# counting non-zeros
df2 = df1.astype(bool).sum(axis=1)

# sum and divide
df3 = df1.sum(axis=1) / df2
df['avg(a)'] = df3.fillna(0)
print(df)


   a1  a2  a3  b1  avg(a)
0   0   0   0   1     0.0
1   1   2   0   2     1.5
2   3   0   0   3     3.0
3   2   4   0   4     3.0

在某些情况下,这种方法可能很方便,但上面的解决方案要简单得多,谢谢。 - newbs_dasc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接