问题描述
我正在使用这个 kaggle 数据集,我正在尝试将分类值转换为数值,以便我可以应用回归。
https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data
这是我迄今为止尝试过的示例。
train_data = pd.read_csv('train.csv')
column_contents = []
for row in train_data['Street']:
if type(row) not in (int,float):
column_contents.append(row)
unique_contents = set(column_contents)
ds = {}
for i,j in enumerate(unique_contents):
ds[j] = i
train_data['Street'] = train_data['Street'].replace(ds.keys(),list(map(str,ds.values())),regex=True)
此后,我创建了以下函数以将其应用于 df 的所有列:
def calculation(df,column):
column_contents = []
for row in df[column]:
if type(row) not in (int,float):
column_contents.append(row)
unique_contents = set(column_contents)
ds = {}
for i,j in enumerate(unique_contents):
ds[j] = i
df[column] = df[column].replace(ds.keys(),regex=True)
return df[column]
for column in train_data:
train_data[column] = calculation(train_data,column)
但是这个功能不行,我觉得在很多层面上都是错的。任何帮助将不胜感激。 我也知道这可以使用其他模块 (numpy) 来完成,但我更愿意这样做来练习。
解决方法
您已正确编码,期望使用 regex=True
代替。由于您想用值替换匹配的键,因此不应使用 regex
。此外,必须单独处理 NaN。
同样在方法 calculation
中,您已经在替换数据框中的列,因此您不必返回它并再次分配它。
代码:
train_data = pd.read_csv('train.csv')
# Replace all NaNs with -1
train_data = train_data.fillna(-1)
def calculation(df,column):
column_contents = []
for row in df[column]:
if type(row) not in (int,float):
column_contents.append(row)
unique_contents = set(column_contents)
ds = {}
for i,j in enumerate(unique_contents):
ds[j] = i
df[column] = df[column].replace(ds.keys(),list(map(str,ds.values()))).astype(float)
for column in train_data:
calculation(train_data,column)
print (train_data.dtypes)
输出:
Id float64
MSSubClass float64
MSZoning float64
LotFrontage float64
LotArea float64
...
MoSold float64
YrSold float64
SaleType float64
SaleCondition float64
SalePrice float64
Length: 81,dtype: object
如您所见,所有列都转换为 float
。