按子目录平均值加速 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
让我们尝试以下操作,将 groupby
与 transform
结合使用:
filled['FDG'].fillna(filled.groupby('RID')['FDG'].transform('mean'))
或
fill4 = filled.fillna(filled.groupby('RID').transform('mean'))
我的数据包含在"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
让我们尝试以下操作,将 groupby
与 transform
结合使用:
filled['FDG'].fillna(filled.groupby('RID')['FDG'].transform('mean'))
或
fill4 = filled.fillna(filled.groupby('RID').transform('mean'))