技术求助:如何将原数据集Top5000高价房源与近地标房源做对比分析
近地标房源房价分析的可行解决方案
问题背景
我拥有80000+行数据的房价数据集,已通过经纬度计算出每套房源到城市地标Iceriseher的距离,发现有5500+套房源距离该地标不足2km。需要验证这些近地标房源是否属于原数据集中的高价房源,以及这类房源在Top5000高价房源中的占比,但之前的代码在数据整合和对比操作时均未成功。
原代码的核心问题
- 循环内重复创建
distance_to_iceriseher_ser,完全冗余且无意义 - 未将计算出的距离数据添加到原DataFrame中,导致后续访问列时出错
- 提取Top5000房源的逻辑错误:先筛选近地标再取Top5000,不符合“先找所有高价Top5000再看其中近地标占比”的需求
- 重新读取数据集后直接赋值Series,未确保索引匹配,可能引发数据错位
修正后的完整代码
import pandas as pd from math import sin, cos, sqrt, atan2, radians # 读取原始房价数据集 data = pd.read_csv('binaaz_train.csv') # 定义经纬度距离计算函数(Haversine公式) def haversine_distance(lat, lon): # Iceriseher地标的经纬度(已转弧度) target_lat = radians(40.3672364) target_lon = radians(49.8315896) lat_rad = radians(lat) lon_rad = radians(lon) delta_lon = target_lon - lon_rad delta_lat = target_lat - lat_rad # 计算距离核心公式 a = sin(delta_lat / 2)**2 + cos(lat_rad) * cos(target_lat) * sin(delta_lon / 2)**2 c = 2 * atan2(sqrt(a), sqrt(1 - a)) return round(6373.0 * c, 5) # 地球半径取6373.0km # 为数据集添加距离列 data['distance_to_iceriseher'] = data.apply(lambda row: haversine_distance(row['latitude'], row['longitude']), axis=1) # 1. 验证近地标房源是否为高价房源:对比价格分位数 print("=== 整体房源价格分位数 ===") print(data['price'].quantile([0.25, 0.5, 0.75, 0.9, 0.99])) print("\n=== 距离Iceriseher不足2km的房源价格分位数 ===") near_landmark_df = data[data['distance_to_iceriseher'] < 2] print(near_landmark_df['price'].quantile([0.25, 0.5, 0.75, 0.9, 0.99])) # 2. 计算Top5000高价房源中近地标房源的占比 top_5000_priced = data.nlargest(5000, 'price') top_5000_near_landmark = top_5000_priced[top_5000_priced['distance_to_iceriseher'] < 2] count = len(top_5000_near_landmark) percentage = (count / 5000) * 100 print(f"\n=== Top5000高价房源统计 ===") print(f"距离Iceriseher不足2km的房源数量:{count}") print(f"占比:{percentage:.2f}%")
代码说明
- 用
apply替代循环计算距离,代码更简洁且效率更高 - 直接将距离数据作为新列添加到原DataFrame,避免数据错位问题
- 通过价格分位数对比,可以直观判断近地标房源的价格水平是否高于整体
- 先提取所有Top5000高价房源,再筛选其中近地标的房源,逻辑符合需求
内容的提问来源于stack exchange,提问作者nihad aliyev
相关产品推荐
相关产品推荐

