одна горячая кодировка много столбцов смешанных данных - PullRequest
0 голосов
/ 11 мая 2018

У меня есть набор данных смешанных типов, которые необходимо преобразовать в числовые, сохраняя при этом информацию из данных символьных типов.Мое текущее решение в R, но мне нужно теперь преобразовать его в Python, учитывая, что человек, который получит этот скрипт, не знает или не хочет переходить к изучению R, что понятно.Возможно ли достичь этого в Python с помощью библиотеки Pandas?И если да, то как этого добиться?

library(data.table)
library(stringr)

dat <- data.table(x = c('No Data', '2', 'Testing', 'Offline'),
                  y = c('2', 'No Data', '4', 'Testing'),
                  z = c(1, 2, 3, 6))

select_cols <- c('x','y')

dat[, paste0(select_cols,'_no_data') := lapply(.SD, function(x) as.numeric(str_detect(x, 'No Data'))), .SDcols = select_cols]
dat[, paste0(select_cols,'_offline') := lapply(.SD, function(x) as.numeric(str_detect(x, 'Offline'))), .SDcols = select_cols]
dat[, paste0(select_cols,'_testing') := lapply(.SD, function(x) as.numeric(str_detect(x, 'Testing'))), .SDcols = select_cols]

dat[, paste0(select_cols) := lapply(.SD, function(x) str_replace(x, 'No Data|Offline|Testing', '0')), .SDcols = select_cols]
dat[, paste0(select_cols) := lapply(.SD, function(x) as.numeric(x)), .SDcols = select_cols]

dat      

редактировать: распечатывать необработанные и предварительно обработанные данные

 x        y          z 
 No Data  2          1 
 2        No Data    2 
 Testing  4          3 
 Offline  Testing    6 

x    y    z   x_no_data   y_no_data   x_offline   y_offline   x_testing   y_testing  
0    2    1           1           0           0           0           0           0  
2    0    2           0           1           0           0           0           0  
0    4    3           0           0           0           0           1           0  
0    0    6           0           0           1           0           0           1  

1 Ответ

0 голосов
/ 11 мая 2018

Вот решение, основная часть которого - pd.get_dummies, которое выполняет для вас кодирование в горячем режиме, и метод pd.to_numeric() с аргументом errors = "coerce" изменяет ваши исходные столбцы x и y так, как вы хотите.

Шаги:

1) создайте пустые столбцы с помощью pd.get_dummies, только для строк, в которых кодируемый столбец является числовым.Это достигается с помощью pd.get_dummies(df.x.loc[~df.x.str.isnumeric()], prefix='x'), например

2) join фиктивных столбцов с исходным кадром данных

3) принудительно переводит ваши исходные x и y в числовые типы, с NaN, когда это невозможно, окончательно заменяя NaN s на 0

df = pd.DataFrame({'x':['No Data', '2', 'Testing', 'Offline'],
                  'y':['2', 'No Data', '4', 'Testing'],
                  'z':[1, 2, 3, 6]})
# Steps 1 and 2
df = (df.join(pd.get_dummies(df.x.loc[~df.x.str.isnumeric()],
                            prefix='x'))
      .join((pd.get_dummies(df.y.loc[~df.y.str.isnumeric()], prefix='y')))
      .fillna(0))

# Step 3
df['x'] = pd.to_numeric(df.x, errors='coerce').fillna(0)
df['y'] = pd.to_numeric(df.y, errors='coerce').fillna(0)

# output:
     x    y  z  x_No Data  x_Offline  x_Testing  y_No Data  y_Testing
0  0.0  2.0  1        1.0        0.0        0.0        0.0        0.0
1  2.0  0.0  2        0.0        0.0        0.0        1.0        0.0
2  0.0  4.0  3        0.0        0.0        1.0        0.0        0.0
3  0.0  0.0  6        0.0        1.0        0.0        0.0        1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...