基于含Yes/No列的房价数据集构建Pandas透视表及分析咨询
问题解决与分析建议
一、修正透视表代码,实现批量groupby求均值
你原来的代码参数逻辑错误,index=['yes','no']不是合法设置——这是列的取值,而非数据中的列名。要实现批量对每个二元列求yes/no对应的平均房价,有两种简洁可行的方法:
方法1:循环合并每个groupby结果
import pandas as pd # 定义需要分析的二元列列表 target_cols = ['mainroad', 'guestroom', 'basement', 'hotwaterheating', 'airconditioning', 'prefarea'] result_list = [] for col in target_cols: # 对单个列分组求平均房价,重置索引并重命名列 group_result = df.groupby(col)['price'].mean().reset_index() group_result.rename(columns={col: 'status', 'price': f'avg_price_{col}'}, inplace=True) result_list.append(group_result) # 以status(yes/no)为键合并所有结果 pivot_table = pd.merge(result_list[0], result_list[1:], on='status', how='outer')
方法2:转成长格式后做透视表(更简洁)
# 将目标列与price字段转成长格式 melted_df = df.melt(id_vars=['price'], value_vars=target_cols, var_name='feature', value_name='status') # 生成透视表:行是yes/no状态,列是特征名称,单元格是对应平均房价 pivot_table = melted_df.pivot_table(index='status', columns='feature', values='price', aggfunc='mean')
第二种方法得到的结果完全符合需求:行取值为yes/no,列是各个二元特征,单元格为对应场景下的平均房价,等价于多次手动执行df.groupby(列名)['price'].mean()。
二、透视表+热图的有效性与实现
这种方法非常有效:二元特征的yes/no房价差异通过热图展示,能直观对比不同特征对房价的影响程度——颜色越深代表平均房价越高,可快速识别出对房价提升更显著的特征(比如空调、优选地段这类)。
实现步骤(基于seaborn库):
import seaborn as sns import matplotlib.pyplot as plt # 使用上面生成的pivot_table数据 plt.figure(figsize=(10, 4)) # 绘制热图,添加数值标注,调整颜色映射 sns.heatmap(pivot_table, annot=True, fmt='.2f', cmap='YlGnBu', cbar=True) plt.title('Average Housing Price by Binary Features') plt.xlabel('Features') plt.ylabel('Status (Yes/No)') plt.show()
运行后会生成一张清晰的热图,每个单元格标注具体平均房价,颜色深浅对应价格高低,特征对房价的影响差异一目了然。
内容的提问来源于stack exchange,提问作者jxqbbb
相关产品推荐
相关产品推荐

