python pandas нормализовать столбец с керасом, затем разбить на группы - PullRequest
0 голосов
/ 22 апреля 2020

Имеет следующий фрейм данных (фактический фрейм данных содержит несколько строк и чисел c столбцов):

col1    col2
0   A   10
1   A   10
2   B   5
3   B   5

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

    col1    col2
0   A           0.632456
1   A           0.632456
2   B           0.316228
3   B           0.316228

А затем разбить его на группы, чтобы получить:

    col1    col2
0   A           0.632456
1   A           0.632456

    col1    col2
0   B           0.316228
1   B           0.316228

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

from keras.utils import normalize
df = pd.DataFrame({"col1":["A","A","B","B"],"col2":[10,10,5,5]})
normalize(df, axis=0)

Но так как у меня есть строки, он не работает, он будет работать, если значения A и B будут иметь числовое значение c.

Q : Как я могу нормализовать числовые значения c по столбцам, не удаляя строковые столбцы, чтобы впоследствии я мог сгруппировать по?

1 Ответ

0 голосов
/ 22 апреля 2020

При работе с категориальными данными вы должны искать такие методы кодирования, как OneHotEncoder. Нет смысла пытаться нормализовать эти столбцы напрямую. В этом случае вы можете использовать масштабатор, такой как MinMaxScaler для числовых столбцов (или keras 'Normalize), а затем один горячий код для категориальных столбцов как:

from sklearn.preprocessing import MinMaxScaler, OneHotEncoder

sc = MinMaxScaler()
oh = OneHotEncoder()

col2_norm = sc.fit_transform(df.col2.to_numpy()[:,None])
col1_one_hot = oh.fit_transform(df.col1.to_numpy()[:,None]).toarray()

np.concatenate([col1_one_hot, col2_norm], axis=1)
array([[1., 0., 1.],
       [1., 0., 1.],
       [0., 1., 0.],
       [0., 1., 0.]])

Если вы просто хотите чтобы нормализовать категориальный столбец, вы можете просто подать Series в масштабатор, а не весь фрейм данных:

sc = MinMaxScaler()
df['col2'] = sc.fit_transform(df.col2.to_numpy()[:,None])

Или аналогично с keras 'normalize:

df['col2'] = normalize(df.col2.to_numpy()).squeeze()

print(df)

  col1  col2
0    A   1.0
1    A   1.0
2    B   0.0
3    B   0.0    ​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...