You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含DataFrame索引的Pandas Series数组操作DataFrame?

高效计算近邻房屋房价中位数的Pandas/Numpy优化方案

问题背景

基于《Hands-On Machine Learning》中的1990加州住房数据集,现有三类共16512行数据:

  • 房屋经纬度DataFrame:lat_longs = housing.iloc[:, :2](索引为13096、14973等)
  • 房价标签Series:housing_labels(存储对应房屋的median_house_value,索引与经纬度数据一致)
  • 近邻索引数组:idx(16512×5的Numpy数组,每行记录当前房屋的5个最近邻房屋索引)

目标是计算每个房屋的5个最近邻房价中位数,当前实现方案为:

pd.Series(list(idx)).apply(lambda x: np.median(housing_labels.iloc[x]))

该方案可行但效率极低,需替换为更高效、优雅的实现方式。

可复现示例

假设housing_labels包含对应索引的房价数据,idx定义如下:

idx = np.array([
    [13096, 20507, 4396],
    [6753, 3785, 14973],
    [14689, 18078, 18031],
    [14973, 20507, 1286]
])

预期输出:[440900. 183900. 160100. 361800.]

优化方案

方案1:纯Numpy向量化实现(最优效率)

利用Numpy的批量索引和向量化中位数计算,完全避免逐行循环:

# 将房价标签转为Numpy数组(若housing_labels是Pandas Series,直接取.values即可)
label_values = housing_labels.values
# 批量获取所有近邻房价,沿每行计算中位数
neighbor_medians = np.median(label_values[idx], axis=1)

输出结果即为预期的Numpy数组。

方案2:保持Pandas Series输出

如果需要结果以Pandas Series形式返回,仅需将Numpy结果包装为Series:

neighbor_medians_series = pd.Series(np.median(housing_labels.values[idx], axis=1))

效率说明

上述方案通过Numpy底层优化的向量化操作实现,相比原apply逐行循环的方式,效率提升可达数十至数百倍,尤其适合16k行规模的数据集。

内容的提问来源于stack exchange,提问作者JoeM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:57:06