Горячее кодирование только для некоторых элементов столбца - PullRequest
1 голос
/ 31 января 2020

В моем наборе данных у меня много столбцов со смешанными категориальными и числовыми значениями. В основном, когда числовое значение было недоступно, присваивается код, например «M», «C» и т. Д. c .., связанный с причиной, по которой он пропал.
Они имеют особое значение и своеобразное поведение, поэтому я хочу назвать их категоричными, а остальное - цифрой c. Минимальный пример:

# Original df
ex1 = ['a', 'b', '0', '1', '2']
df = pd.DataFrame(ex1, columns=['CName'])
print(df)

CName
0     a
1     b
2     0
3     1
4     2

## What I want to achieve
df['CName_a'] = (df.CName == 'a').astype(int)
df['CName_b'] = (df.CName == 'b').astype(int)
ff = (df.CName == 'b') | (df.CName == 'a')
df['CNname_num'] = np.where(ff, np.NaN, df.CName)
df2 = df.drop('CName', axis=1)
print(df2)

   CName_a  CName_b CNname_num
0        1        0        NaN
1        0        1        NaN
2        0        0          0
3        0        0          1
4        0        0          2

Вопрос 1 .
Q1: Как это можно сделать эффективно? В идеале мне нужно связать его в конвейер, что-то вроде fit_transform? Я должен написать с нуля, или из обычных библиотек есть хак для горячего кодирования подмножества столбцов, например ['a', 'b', 'else']?

Вопрос 2 .
Q2: Как мне заполнить 'Nan' для CName_num? Категориальные элементы (в данном примере «a» и «b») имеют поведение, которое отличается от среднего числового значения (фактически от любого числового значения). Я чувствую, что присвоить 0 или «среднее» не правильный выбор, но у меня закончились варианты. Я планирую использовать случайный лес, DNN или даже регрессионное обучение, если оно работает достойно.

1 Ответ

1 голос
/ 31 января 2020

Вот одно из возможных решений. Сначала создайте логическую маску, используя str.isdigit. Используйте pandas.get_dummies и pandas.concat для вашего окончательного кадра данных:

mask = mask = df['CName'].str.isdigit()

pd.concat([pd.get_dummies(df.loc[~mask, 'CName'], prefix='CName')
             .reindex(df.index).fillna(0),
           df.loc[mask].add_suffix('_num')], axis=1)

[out]

   CName_a  CName_b CName_num
0      1.0      0.0       NaN
1      0.0      1.0       NaN
2      0.0      0.0         0
3      0.0      0.0         1
4      0.0      0.0         2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...