车辆数据清洗:满足条件修改mileage字段的报错排查与解决
解决Pandas中替换指定条件数据的问题
错误代码分析
第一段代码错误
代码:
mileage_corr = vehicle_data_all.loc[(vehicle_data_all["mileage"] < 100) & (vehicle_data_all["year"] < 2020)], 1000
报错:AttributeError: 'tuple' object has no attribute...
问题出在语法错误:你把loc查询的结果和1000用逗号隔开,这会创建一个元组,而非对指定位置赋值,自然触发元组相关的属性错误。
第二段代码错误
代码:
mileage_corr = vehicle_data_all.loc[(vehicle_data_all["mileage"] < 100) & (vehicle_data_all["year"] < 2020)] mileage_corr['mileage'].where(mileage_corr['mileage'] <= 100, 1000, inplace=True)
报错:
尝试在DataFrame切片的副本上设置值
请查看Pandas文档中关于视图与副本的注意事项
return self._where(...)
问题在于:通过loc切片得到的mileage_corr可能是原DataFrame的副本,直接修改副本不会同步到原数据,Pandas抛出这个警告提示你可能操作了错误的对象。
正确解法
方法一:直接通过loc定位条件并赋值(推荐)
直接在原DataFrame上定位满足条件的行和mileage列,一次性完成赋值,彻底避免副本/视图问题:
# 定位条件:车龄超1年(year<2020)且里程小于100,修改对应里程为1000 vehicle_data_all.loc[(vehicle_data_all["year"] < 2020) & (vehicle_data_all["mileage"] < 100), "mileage"] = 1000
方法二:使用where方法修改数据
如果想用where,可以直接在原DataFrame上操作,或者明确复制切片后修改:
# 方式1:直接修改原数据 vehicle_data_all["mileage"] = vehicle_data_all["mileage"].where( ~((vehicle_data_all["year"] < 2020) & (vehicle_data_all["mileage"] < 100)), 1000 ) # 注:where逻辑是满足条件时保留原值,不满足时替换为指定值,因此这里用~对目标条件取反 # 方式2:明确复制后修改(需保留原数据时用) mileage_corr = vehicle_data_all.loc[(vehicle_data_all["year"] < 2020) & (vehicle_data_all["mileage"] < 100)].copy() mileage_corr["mileage"] = 1000 # 若需合并回原数据,可使用merge等方式处理
内容的提问来源于stack exchange,提问作者Niamh
相关产品推荐
相关产品推荐

