将分类数据编码为数字

Encoding categorical data to numerical

我正在使用这个 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(), list(map(str, ds.values())), regex=True)

return df[column]

for column in train_data:
 train_data[column] = calculation(train_data,column)

但是,这个功能不行,我觉得它在很多层面上都错了。任何帮助将不胜感激。 我也知道这可以使用其他模块 (numpy) 来完成,但我宁愿这样做来练习。

您已正确编码,希望在替换中使用 regex=True。由于您想用值替换匹配的键,因此不应使用 regex。 NaN 也必须单独处理。

同样在方法 calculation 中,您已经替换了数据框中的列,因此您不必 return 它并再次分配它。

代码:

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