Я использую этот набор данных 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 вы уже заменяете столбец в фрейме данных, поэтому вам не нужно возвращать его и назначать снова.
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.
Можете ли вы опубликовать образец данных и желаемых результатов в теле сообщения без внешних ссылок, которые могут стать мертвыми для будущих читателей? Ваше использование циклов кажется слишком сложным для преобразования в категориальные столбцы.