Pandas按组计算平均值时如何处理NaN值

6

I have the following dataframe:

date id  cars
2012 1    4  
2013 1    6
2014 1    NaN    
2012 2    10 
2013 2    20 
2014 2    NaN  

现在,我想得到每个id的汽车年度平均值,忽略NaN值。结果应该像这样:
date id  cars  result
2012 1    4      5
2013 1    6      5
2014 1    NaN    5
2012 2    10     15
2013 2    20     15
2014 2    NaN    15

我有以下命令:

df["result"]=df.groupby("id")["cars"].mean()

该命令运行时没有错误,但结果列只有NaN。 我做错了什么?
2个回答

10

使用transform,它会返回一个与原始数据大小相同的Series:

df["result"]=df.groupby("id")["cars"].transform('mean')
print (df)
   date  id  cars  result
0  2012   1   4.0     5.0
1  2013   1   6.0     5.0
2  2014   1   NaN     5.0
3  2012   2  10.0    15.0
4  2013   2  20.0    15.0
5  2014   2   NaN    15.0

0

你好,2017年的老问题。这只是另一种方法,但有很多额外开销。你提到了使用df["result"]=df.groupby("id")["cars"].mean()时只得到NaN值作为平均值(只要其中一个数字是NaN)。在2023年,我没有遇到过这个问题。也许,这个问题已经在后来的版本中得到了修复?无论如何,如果你在任何时间和空间再次面临这个问题,你可能想首先知道如何获得每个id的平均值而不会被NaN所影响:

import numpy as np
np.seterr(divide='ignore', invalid='ignore')
df.groupby(['id']).apply(lambda x: np.average(x['cars'].dropna()))

接下来,按照id进行连接。我不会花时间展示这个过程,因为这个答案对于你手头的问题有很多额外的开销,而且不应该被使用。可能只有一些人在寻找一种方法来在第一次获取结果时避免NaNs


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