解决Pandas SettingWithCopyWarning问题并计算Whitby房屋数据年均值
解决SettingWithCopyWarning并优化日期处理
问题根源
你碰到的SettingWithCopyWarning,是因为filtered_df = housing_raw_data_df[housing_raw_data_df["Location"] == "Whitby"]得到的是原DataFrame的视图而非独立副本,后续对它的修改会触发Pandas的警告——这是在提醒你,你可能在修改原数据的切片副本,容易引发意料之外的问题。
两步解决优化方案
1. 避免视图修改,创建独立副本
在筛选时直接生成独立DataFrame副本,彻底规避视图修改的风险:
filtered_df = housing_raw_data_df[housing_raw_data_df["Location"] == "Whitby"].copy()
也可以用.loc语法完成筛选并生成副本:
filtered_df = housing_raw_data_df.loc[housing_raw_data_df["Location"] == "Whitby", :].copy()
2. 优化日期处理逻辑
别用字符串切片提取年份,建议先把Date列转为Pandas的datetime类型,再通过.dt.year提取年份——这种方法能兼容更多日期格式(比如2015/03/12、2015-03-12等),比字符串切片更可靠:
# 自动识别日期格式并转换为datetime类型 housing_raw_data_df["Date"] = pd.to_datetime(housing_raw_data_df["Date"], infer_datetime_format=True) # 提取年份到新列 filtered_df["Year"] = filtered_df["Date"].dt.year
完整修改后的代码
import pandas as pd # 读取CSV数据 housing_raw_data_df = pd.read_csv("MLS.csv") # 将Date列转换为datetime类型 housing_raw_data_df["Date"] = pd.to_datetime(housing_raw_data_df["Date"], infer_datetime_format=True) # 筛选Whitby数据并创建独立副本 filtered_df = housing_raw_data_df[housing_raw_data_df["Location"] == "Whitby"].copy() # 提取年份 filtered_df["Year"] = filtered_df["Date"].dt.year # 按年份分组计算CompBenchmark的平均值 average_data = filtered_df.groupby("Year")["CompBenchmark"].mean().reset_index() # 过滤出2015-2021年的数据 average_data = average_data[(average_data["Year"] >= 2015) & (average_data["Year"] <= 2021)] print(average_data)
额外提示
- 如果想减少计算量,可以在分组前先过滤年份:
filtered_df = filtered_df[(filtered_df["Year"] >= 2015) & (filtered_df["Year"] <= 2021)]
- 若
pd.to_datetime无法识别日期格式,可手动指定格式规则,比如format="%Y-%m-%d"。
内容的提问来源于stack exchange,提问作者Penguinite
相关产品推荐
相关产品推荐

