按子目录平均值加速 Pandas fillna(如何替换 for 循环)

speed up a Pandas fillna by subcatagory mean (how to replace a for loop)

我的数据包含在"RID"列中编码的几个子类别,我按每个子类别的平均值进行填充。我一直在使用的代码非常慢。正在寻找摆脱 for 循环的更好方法。

filled = mergedf.copy()
for c,v in enumerate(mergedf.RID.unique()):
    filled.loc[filled.RID == v, :] = filled.loc[filled.RID == v, :].fillna(filled.loc[filled.RID == v, :].mean())

filled.info()

我一直在尝试按照有人建议的 groupby 来加快速度,但我无法使合并正常工作。

pts_mean = mergedf.groupby("RID").mean()
fill2 = merge.combine_first(pts_mean)

fill3 = pd.merge(mergedf, pts_mean, on="RID", how="left")

我已经尝试了如何 = "inner" 以及如何 = "outer"

查看我的测试数据,之前:

print(mergedf.loc[mergedf.RID==2,"FDG"])
0     1.36926
1     1.21655
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8         NaN
9         NaN
10        NaN
11        NaN
12        NaN

慢的方法之后(这是想要的结果,我只是不想花这么长时间)

print(filled.loc[filled.RID==2,"FDG"])
0     1.369260
1     1.216550
2     1.292905
3     1.292905
4     1.292905
5     1.292905
6     1.292905
7     1.292905
8     1.292905
9     1.292905
10    1.292905
11    1.292905
12    1.292905

在combine_first方法之后

print(fill2.loc[fill2.RID==2,"FDG"])
0     1.369260
1     1.216550
2     1.292905
3     1.074235
4          NaN
5     1.319690
6          NaN
7          NaN
8     1.264300
9          NaN
10    1.042469
11         NaN
12         NaN

在pd.merge

之后
print(fill3.loc[fill3.RID==2,["FDG_x","FDG_y"]])
      FDG_x     FDG_y
0   1.36926  1.292905
1   1.21655  1.292905
2       NaN  1.292905
3       NaN  1.292905
4       NaN  1.292905
5       NaN  1.292905
6       NaN  1.292905
7       NaN  1.292905
8       NaN  1.292905
9       NaN  1.292905
10      NaN  1.292905
11      NaN  1.292905
12      NaN  1.292905

让我们尝试以下操作,将 groupbytransform 结合使用:

filled['FDG'].fillna(filled.groupby('RID')['FDG'].transform('mean'))

fill4 = filled.fillna(filled.groupby('RID').transform('mean'))