Python数据分析实战:用Pandas和NumPy清洗长沙二手房数据集(含异常值处理与分组统计)

张开发
2026/4/11 12:37:12 15 分钟阅读

分享文章

Python数据分析实战:用Pandas和NumPy清洗长沙二手房数据集(含异常值处理与分组统计)
Python数据分析实战用Pandas和NumPy清洗长沙二手房数据集含异常值处理与分组统计在数据分析领域数据清洗往往占据了整个项目70%以上的时间成本。一份未经处理的原始数据集就像未经雕琢的玉石只有经过专业的数据清洗流程才能展现出真正的价值。本文将带你深入实战使用Python生态中最强大的Pandas和NumPy工具包对长沙二手房市场数据进行系统化清洗与统计分析。1. 数据准备与环境搭建工欲善其事必先利其器。在开始数据清洗前我们需要确保环境配置正确。推荐使用Anaconda创建独立的Python 3.8环境conda create -n housing_analysis python3.8 conda activate housing_analysis pip install pandas numpy matplotlib seaborn sqlalchemy假设我们已经通过爬虫获取了原始数据数据包含21个字段存储格式为CSV。让我们先加载数据并快速浏览import pandas as pd import numpy as np # 读取原始数据 raw_data pd.read_csv(changsha_housing.csv, encodingutf-8) # 显示前3行及数据概览 print(raw_data.head(3)) print(\n数据维度:, raw_data.shape) print(\n字段类型:\n, raw_data.dtypes)常见初始问题诊断字符编码问题特别是中文数据集日期字段被识别为字符串数值字段中的非数字字符如暂无、面议隐藏的空白字符或特殊符号2. 结构化数据清洗流程2.1 时间类型标准化处理时间字段是数据分析中的黄金维度但原始数据中的时间格式往往五花八门。我们的数据包含挂牌时间字段需要转换为标准的datetime类型# 处理时间字段的多种方法对比 def convert_datetime(df, col): # 方法1自动推断格式 try: df[col] pd.to_datetime(df[col], infer_datetime_formatTrue) except: # 方法2指定常见中文日期格式 date_formats [%Y年%m月%d日, %Y/%m/%d, %Y-%m-%d] for fmt in date_formats: try: df[col] pd.to_datetime(df[col], formatfmt) break except: continue return df raw_data convert_datetime(raw_data, 挂牌时间) # 验证转换结果 print(时间字段示例:\n, raw_data[挂牌时间].head()) print(\n时间范围:, raw_data[挂牌时间].min(), 至, raw_data[挂牌时间].max())时间处理进阶技巧提取年、月、日等时间维度特征计算挂牌时长当前日期-挂牌日期识别异常时间点如未来日期2.2 文本字段结构化拆分原始数据中的区域字段包含层级信息如岳麓区-梅溪湖我们可以将其拆分为更结构化的形式# 区域字段拆分 area_split raw_data[区域].str.split(-, expandTrue) raw_data[所在区域] area_split[0] raw_data[具体区域] area_split[1] # 删除原始字段 raw_data.drop(区域, axis1, inplaceTrue) # 检查拆分结果 print(区域分布统计:\n, raw_data[所在区域].value_counts())文本处理常见问题解决方案问题类型解决方法Pandas函数不一致分隔符正则表达式分割str.split()配合正则缺失分隔符条件判断处理np.where str.contains多余空格统一去除str.strip()非标准名称映射标准化replace或map方法2.3 数值字段清洗与异常值处理房价数据中的异常值会严重影响分析结果。我们需要系统化处理单价和总价字段# 单价清洗流程 def clean_price(df, col): # 统一单位假设原始数据包含元/平米等后缀 df[col] df[col].astype(str).str.replace([^\d.], , regexTrue) df[col] pd.to_numeric(df[col], errorscoerce) # 异常值过滤基于3σ原则 mean df[col].mean() std df[col].std() upper_bound mean 3*std lower_bound mean - 3*std df[col] np.where(df[col] upper_bound, np.nan, df[col]) df[col] np.where(df[col] lower_bound, np.nan, df[col]) return df raw_data clean_price(raw_data, 单价) raw_data clean_price(raw_data, 总价) # 建筑面积处理 raw_data[建筑面积] raw_data[建筑面积].str.replace(㎡, ).astype(float) # 缺失值统计 print(缺失值统计:\n, raw_data.isnull().sum())异常值处理策略对比方法适用场景优缺点3σ原则正态分布数据简单有效但对偏态数据不适用IQR方法非正态分布对极端值更鲁棒百分位法大规模数据需要合理设置阈值3. 高级数据转换技巧3.1 分类数据编码机器学习模型需要数值型输入我们需要对装修、朝向等分类变量进行编码# 装修等级映射 decoration_map {毛坯:0, 简装:1, 中装:2, 精装:3, 豪装:4} raw_data[装修] raw_data[装修].map(decoration_map) # 朝向热度编码考虑长沙气候特点 orientation_dummies pd.get_dummies(raw_data[朝向], prefix朝向) raw_data pd.concat([raw_data, orientation_dummies], axis1) # 电梯转换为二进制 raw_data[有无电梯] raw_data[有无电梯].map({有:1, 无:0})编码方法选择指南有序分类使用数值映射如装修等级无序分类使用独热编码如朝向二元类别直接转换为0/13.2 衍生特征工程基于原始字段创建更有意义的衍生特征# 创建单价-面积散点图 import matplotlib.pyplot as plt plt.scatter(raw_data[建筑面积], raw_data[单价]) plt.xlabel(建筑面积(㎡)) plt.ylabel(单价(元/㎡)) plt.title(长沙二手房单价-面积关系) plt.show() # 计算每平米价格与均值的差异 district_avg_price raw_data.groupby(所在区域)[单价].transform(mean) raw_data[价格差异指数] raw_data[单价] / district_avg_price - 1 # 建筑年代转换为房龄 current_year pd.Timestamp.now().year raw_data[房龄] current_year - raw_data[建筑年代]4. 数据聚合与统计分析4.1 多维度分组分析Pandas的groupby功能是数据分析的核心工具下面展示几种高级用法# 基础分组统计 district_stats raw_data.groupby(所在区域).agg({ 单价: [mean, median, std], 总价: [sum, mean], 建筑面积: [count, sum] }) # 多层分组分析 decoration_district raw_data.groupby([所在区域, 装修]).agg({ 单价: mean, 总价: [count, mean] }).unstack() # 时间序列分析 monthly_trend raw_data.groupby( [raw_data[挂牌时间].dt.year, raw_data[挂牌时间].dt.month] )[单价].mean().plot(title长沙二手房月度价格趋势)性能优化技巧对于大数据集使用pd.Grouper进行时间分组更高效考虑将分类变量设置为category类型以减少内存占用复杂聚合操作可先用query过滤再分组4.2 交叉分析与透视表透视表可以快速实现多维数据分析# 区域-装修等级交叉分析 pivot_table pd.pivot_table( raw_data, values总价, index所在区域, columns装修, aggfunc[mean, count], marginsTrue ) # 带分位数分析的透视表 def q25(x): return x.quantile(0.25) def q75(x): return x.quantile(0.75) price_analysis raw_data.groupby(所在区域)[单价].agg([ mean, median, q25, q75, count ]).sort_values(mean, ascendingFalse)5. 数据存储与质量控制5.1 清洗后数据存储完成所有清洗步骤后将数据保存为多种格式以备后续使用# 保存为CSV保留中文编码 clean_data raw_data.copy() clean_data.to_csv(cleaned_housing_data.csv, indexFalse, encodingutf_8_sig) # 保存到MySQL from sqlalchemy import create_engine engine create_engine(mysqlpymysql://user:passwordlocalhost/housing_db) clean_data.to_sql(changsha_housing, conengine, if_existsreplace, indexFalse) # 保存为高性能格式 clean_data.to_parquet(cleaned_housing_data.parquet)存储格式对比格式读取速度写入速度大小特点CSV慢慢大通用性好Parquet快快小列式存储适合分析Feather最快快中内存交换格式SQL中中-支持复杂查询5.2 数据质量验证报告生成数据质量报告确保清洗效果def generate_quality_report(df): report pd.DataFrame({ 字段类型: df.dtypes, 缺失值数: df.isnull().sum(), 缺失值比例: df.isnull().mean().round(4), 唯一值数: df.nunique(), 示例值: df.iloc[0] }) return report quality_report generate_quality_report(clean_data) print(quality_report)关键质量指标缺失率低于5%为优秀字段类型符合业务逻辑数值范围在合理区间分类变量取值符合预期在完成所有清洗步骤后数据集已经准备好用于更深入的分析或机器学习建模。记住优秀的数据清洗不是一次性的工作而应该建立可复用的处理管道特别是当需要定期处理新数据时。

更多文章