【问题标题】:Python imputing values using median basis specific column value selection使用中值基础特定列值选择的 Python 插补值
【发布时间】:2020-02-05 16:32:22
【问题描述】:

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

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 的相同空白应以类似的方式估算。

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

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

【问题讨论】:

  • 为什么是 5 而不是 7.5 或 10?
  • @ansev:你是对的。我添加数字 5 只是为了表示考虑,因为 0 为空白,所以 0、5、10 的中位数为 5。

标签: python-3.x pandas pandas-groupby missing-data


【解决方案1】:

要填写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 

【讨论】:

    【解决方案2】:

    试试这个:

    df['Salary']=df.groupby(['Position'])['Salary'].apply(lambda x:x.fillna(x.median()))
    

    本质上,我们在职位上应用一个关于薪水的 groupby,然后用每个组的中位数填充。

    【讨论】:

    • 如果您的解决方案与我所做的类似,并且需要多个 groupby 句子,则可以使用 apply 并且只能使用。在您提出的这个解决方案中,使用起来要快得多:df['Salary'] = df['Salary'].fillna(df.groupby('Position').Salary.transform('median'))
    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2021-09-15
    • 2018-01-02
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多