根据条件查找中位数以填写缺失值

时间:2019-12-11 21:37:43

标签: pandas numpy

我有一个包含州,县,年和hpi(房屋价格指数)的数据框。在hpi列中缺少值。要完成这些值的填充工作,是获取hpi值的中位数,然后用该中位数填充缺失值。

我要做的是根据年份,州和县名找到中位数,对于缺少的值,请用中位数填写。对我来说,这似乎比将整个数据集的中位数强一些。

以下是我拥有的数据的示例:

enter image description here

因此,中位数为184.02,我将用它填充那些空值。

这是我在Python中尝试过的方法:

<div class="container">
<div class="myline">
  <div class="myblock">
  <p class="bingo">
    Spiffy hair!
  </p></div>
</div>
<div class="myline">
  <div class="myblock">
  <p class="bingo">
    Spiffy<sup>&reg;</sup> hair!
  </p></div>
</div>
<div class="myline">
  <div class="myblock">
    <p class="bingo">
      Vacuum <sub>&reg;</sub>
    </p>
    </div>
</div>
  <div class="show-baseline"></div>
</div>

由于我的数据比提供的示例要大得多,因此上面的函数要花很长时间才能运行,并且时间复杂度为O(n ^ 3),所以效果不太好。有没有一种更Python化的方式来做到这一点呢?

2 个答案:

答案 0 :(得分:1)

您可以使用groupby

medians = df.groupby(['year','state','County_name'])['hpi'].transform('median')

df['hpi'] = df['hpi'].fillna(medians)

如果某个县没有任何数据:

medians = (df.groupby(['year', 'state', 'County_name'])['hpi']
             .transform(lambda x: x.median() if x.notnull().any() else np.nan)
          )

答案 1 :(得分:0)

您可以使用此代码获取每个组的中位数,也可以使用熊猫随附的中位数,因为默认情况下它会忽略NaN:

data_median = data.groupby(['Year','state','County_name']).agg({'col1':'median'}).reset_index().rename(columns={'col1':'median_hpi'})

请注意,我将重命名该列以使下一步更容易。可能有更清洁的方法可以做到这一点,但这是我通常使用的快捷方法。

一旦您有了一个包含中位数的数据框,就可以将其重新加入到原始数据中,如果hpi为空,则可以合并/并合并/ combine_first()以获取中位数。

data = data.merge(data_median, on = ['Year','state','County_name'])
data['filled_hpi'] = data.hpa.combine_first(data.median_hpi)

这应该可以更快地完成目标。