如何基于含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
相关产品推荐
相关产品推荐

