Вменение только числовых значений с помощью sci-kit learn - PullRequest
2 голосов
/ 12 марта 2019

Итак, у меня есть DataFrame, который содержит смесь как Категориальных, так и Числовых значений, которые в настоящее время 12345 строк по 171 столбцам.

У меня пропущены значения как в переменной категории, так и в числовой, где я хотел бы рассчитать значения. Для числовых столбцов я делаю следующее:

import pandas as pd
import numpy as np

data = pd.read_csv('filepath')

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data = imp.fit_transform(data)

Я тогда получаю следующую ошибку

ValueError: could not convert string to float: 'USD'

Это я понимаю, потому что я использую sci-kit learn imputer с strategy = mean, который не совместим с категориальными переменными. Я бы предпочел не проходить через каждый столбец и вручную извлекать числовые значения, поэтому я ищу способ, которым я могу выполнить это вычисление только для числовых столбцов.

Спасибо

1 Ответ

1 голос
/ 12 марта 2019

Если вы используете функциональность категориального кодирования от panda, все это можно сделать довольно просто.Однако я редко нахожу себя с правильно закодированными данными и предпочел бы иметь надежное решение, чем полагаться на чистых панд.

Вот что я бы сделал.

categorical_columns = []
numeric_columns = []
for c in data.columns:
    if data[c].map(type).eq(str).any(): #check if there are any strings in column
        categorical_columns.append(c)
    else:
        numeric_columns.append(c)

#create two DataFrames, one for each data type
data_numeric = data[numeric_columns]
data_categorical = pd.DataFrame(data[categorical_columns])


from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data_numeric = pd.DataFrame(imp.fit_transform(data_numeric), columns = data_numeric.columns) #only apply imputer to numeric columns


#you could do something like one-hot-encoding of data_categorical here

#join the two masked dataframes back together
data_joined = pd.concat([data_numeric, data_categorical], axis = 1)
...