按条件修改medianIncome列值时触发错误,寻求解决方法
问题:截断medianIncome列的数值范围
需求:将medianIncome列中≤0.4999的值修改为0.4999,≥15.0001的值修改为15.0001。
样本数据
id medianHouseValue housingMedianAge totalBedrooms totalRooms households population medianIncome 0 23 113.903 31.0 543.0 2438.0 481.0 1016.0 1.7250 1 24 99.701 56.0 337.0 1692.0 328.0 856.0 2.1806 2 26 107.500 41.0 123.0 535.0 121.0 317.0 2.4038 3 27 93.803 53.0 244.0 1132.0 241.0 607.0 2.4597 4 28 105.504 52.0 423.0 1899.0 400.0 1104.0 1.8080
尝试的代码及错误
第一次尝试
housing.loc[housing['medianIncome'] > 15.0001, 'medianIncome'] = 15.0001 housing.loc[housing['medianIncome'] < 0.4999, 'medianIncome'] = 0.4999
错误信息:
AttributeError: 'list' object has no attribute 'loc'
第二次尝试
housing['medianIncome'] = np.where(housing['medianIncome'] >= 15.0001, housing['medianIncome']) housing['medianIncome'] = np.where(housing['medianIncome'] <= 0.4999, housing['medianIncome'])
错误信息:
TypeError: list indices must be integers or slices, not str
解决方案
错误根源
两个错误都是因为housing是Python列表而非pandas DataFrame。列表不支持loc属性,也不能用字符串索引取列,只有DataFrame才能实现这些操作。
步骤1:将列表数据转为pandas DataFrame
假设你的数据以列表形式存储,先转换为DataFrame:
import pandas as pd # 按实际数据结构整理列表,这里以样本数据为例 data = [ [0, 23, 113.903, 31.0, 543.0, 2438.0, 481.0, 1016.0, 1.7250], [1, 24, 99.701, 56.0, 337.0, 1692.0, 328.0, 856.0, 2.1806], [2, 26, 107.500, 41.0, 123.0, 535.0, 121.0, 317.0, 2.4038], [3, 27, 93.803, 53.0, 244.0, 1132.0, 241.0, 607.0, 2.4597], [4, 28, 105.504, 52.0, 423.0, 1899.0, 400.0, 1104.0, 1.8080] ] columns = ['id', 'medianHouseValue', 'housingMedianAge', 'totalBedrooms', 'totalRooms', 'households', 'population', 'medianIncome'] housing = pd.DataFrame(data, columns=columns)
步骤2:截断数值范围
推荐使用pandas内置的clip方法,专门用于数值截断,代码更简洁:
housing['medianIncome'] = housing['medianIncome'].clip(lower=0.4999, upper=15.0001)
如果坚持用loc或np.where,也可以这样写:
用loc实现
housing.loc[housing['medianIncome'] > 15.0001, 'medianIncome'] = 15.0001 housing.loc[housing['medianIncome'] < 0.4999, 'medianIncome'] = 0.4999
用np.where实现
注意np.where需要三个参数:条件、满足条件时的值、不满足条件时的值:
import numpy as np housing['medianIncome'] = np.where(housing['medianIncome'] >= 15.0001, 15.0001, housing['medianIncome']) housing['medianIncome'] = np.where(housing['medianIncome'] <= 0.4999, 0.4999, housing['medianIncome'])
内容的提问来源于stack exchange,提问作者Kdoyle73
相关产品推荐
相关产品推荐

