首页 > 解决方案 > 使用中值基础特定列值选择的 Python 插补值

问题描述

我想用我的数据框的中位数来估算一些空白值,如下所示:

ID Salary Position
1  10     VP
2         VP
3  5      VP
4  15     AVP
5  20     AVP
6         AVP

现在必须用职位级别 Median 替换空白工资。例如:ID = 2 的空白工资和作为 VP 的职位应按职位 VP 的中位数 5 估算,而 AVP 的相同空白应以类似的方式估算。

我使用了以下代码,但这是在 Position 级别采用完整的中位数而不是特定的中位数:

impute_median=df['Salary'].median()
df['Salary']=df['Salary'].fillna(impute_median)

输出应如下所示:

   ID Salary Position
   1      10     VP
   2      5      VP
   3      5      VP
   4      15     AVP
   5      20     AVP
   6      15     AVP

标签: python-3.xpandaspandas-groupbymissing-data

解决方案


要填写median您应该使用:

df['Salary'] = df['Salary'].fillna(df.groupby('Position').Salary.transform('median'))
print(df)
   ID  Salary Position
0   1    10.0       VP
1   2     7.5       VP
2   3     5.0       VP
3   4    15.0      AVP
4   5    20.0      AVP
5   6    17.5      AVP

如果要填写最接近中值(更少)

df['Salary'] = df['Salary'].fillna(df.Salary.sub(df.groupby('Position')
                                    .Salary
                                    .transform('median'))
                           .where(lambda x: x.le(0))
                           .groupby(df['Position'])
                           .transform('idxmax')
                           .map(df['Salary']))
print(df)
0   1    10.0       VP
1   2     5.0       VP
2   3     5.0       VP
3   4    15.0      AVP
4   5    20.0      AVP
5   6    15.0      AVP 

推荐阅读