我有一个包含州,县,年和hpi(房屋价格指数)的数据框。在hpi列中缺少值。要完成这些值的填充工作,是获取hpi值的中位数,然后用该中位数填充缺失值。
我要做的是根据年份,州和县名找到中位数,对于缺少的值,请用中位数填写。对我来说,这似乎比将整个数据集的中位数强一些。
以下是我拥有的数据的示例:
因此,中位数为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>®</sup> hair!
</p></div>
</div>
<div class="myline">
<div class="myblock">
<p class="bingo">
Vacuum <sub>®</sub>
</p>
</div>
</div>
<div class="show-baseline"></div>
</div>
由于我的数据比提供的示例要大得多,因此上面的函数要花很长时间才能运行,并且时间复杂度为O(n ^ 3),所以效果不太好。有没有一种更Python化的方式来做到这一点呢?
答案 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)
这应该可以更快地完成目标。