我有一个具有两个特征的数据框:gps_height(数字)和区域(分类)。
gps_height 包含很多 0 值,在这种情况下是缺失值。我想用相干区域的平均值填充 0 值。
我的推理如下:
1.去掉零值,取gps_height的平均值,按地区分组
df[df.gps_height !=0].groupby(['region']).mean()
但是如何用这些平均值替换我的数据框中的零值?
样本数据:
gps_height 区域
第 1390 章
1 1400 马拉
2 0 伊林加
3 250 伊林加
...
最佳答案
用:
df = pd.DataFrame({'region':list('aaabbbccc'),
'gps_height':[2,3,0,3,4,5,1,0,0]})
print (df)
region gps_height
0 a 2
1 a 3
2 a 0
3 b 3
4 b 4
5 b 5
6 c 1
7 c 0
8 c 0
替换
0
到缺失值,然后替换 NAN
来自 fillna
与 mean
来自 GroupBy.transform
每组:df['gps_height'] = df['gps_height'].replace(0, np.nan)
df['gps_height']=df['gps_height'].fillna(df.groupby('region')['gps_height'].transform('mean'))
print (df)
region gps_height
0 a 2.0
1 a 3.0
2 a 2.5
3 b 3.0
4 b 4.0
5 b 5.0
6 c 1.0
7 c 1.0
8 c 1.0
或者过滤掉
0
值,聚合 means
并映射所有 0
行:m = df['gps_height'] != 0
s = df[m].groupby('region')['gps_height'].mean()
df.loc[~m, 'gps_height'] = df['region'].map(s)
#alternative
#df['gps_height'] = np.where(~m, df['region'].map(s), df['gps_height'])
print (df)
region gps_height
0 a 2.0
1 a 3.0
2 a 2.5
3 b 3.0
4 b 4.0
5 b 5.0
6 c 1.0
7 c 1.0
8 c 1.0
关于python - 如何根据groupby用平均值替换0值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189962/