按列分组并添加平均值列

3

我希望将dataframe的列值替换为另一列分组后的平均值(去除0值)。

dataframe df 如下:

ID | TYPE | rate
-------------
1  |    A | 0 <- Replace this
2  |    B | 2
3  |    C | 1
4  |    A | 2
5  |    C | 1
6  |    C | 0 <- Replace this
7  |    C | 8
8  |    C | 2
9  |    D | 0 <- Replace this

我必须替换评分中值为0的数值:

df['rate'][df['rate']==0] = ?

对于该类型,平均值为:

每种类型的平均(除零外)值为:

A = 2/1 = 2

B = 2/1 = 2

C = (1 + 1 + 8 + 2)/4 = 3

D = 0(当没有类型信息时,默认值为0

期望结果:

ID | TYPE | rate
-------------
1  |    A | 2 <- Changed
2  |    B | 2
3  |    C | 1
4  |    A | 2
5  |    C | 1
6  |    C | 3 <- Changed
7  |    C | 8
8  |    C | 2
9  |    D | 0 <- Changed

1
在使用 df['rate'][df['rate']==0] = ... 时要小心,最好使用 df.loc[df['rate']==0, 'rate'] = ...,详见这里 - IanS
1个回答

3

您可以使用mask函数对数据帧中的rate列进行掩码处理,然后按照TYPE进行分组,再使用transform函数求均值,这将排除NaNs。最后,使用fillna函数替换掉掩码数据帧中的值:

ma = df.rate.mask(df.rate.eq(0))
df['rate'] = ma.fillna(ma.groupby(df.TYPE).transform('mean').fillna(0))

   ID  TYPE  rate
0   1    A   2.0
1   2    B   2.0
2   3    C   1.0
3   4    A   2.0
4   5    C   1.0
5   6    C   3.0
6   7    C   8.0
7   8    C   2.0
8   9    D   0.0

那...似乎不对,你最终会得到基本上是平均值的结果。 - IanS
OP想要将rate为0的值替换为相应组(不包括0)的平均值。这就是@IanS在这里所做的。 - yatu

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