将分类数据编码为数字

问题描述

我正在使用这个 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