python - 如何根据groupby用平均值替换0值

标签 python pandas replace transform

我有一个具有两个特征的数据框: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/

相关文章:

java - 将字符串拆分为仅 3 个字符。 java

python - Pandas/Python 中的数据操作

python:使用基于另一列的值创建一个新列,然后连接。?

python计算到列中数字的距离

javascript - 如何拆分和重建字符串?

python - 如何正确地将 python 捆绑安装到 Windows 用户

python - 如何使用python在另一个图像中查找图像

python - Pandas DataFrame - 测试更改/修改

python - 按重复日期分组的 Pandas

c - 使用循环替换字符串中的每个字母