将分类数据编码为数字
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
。
我正在使用这个 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
。