一个热编码混合数据的许多列

时间:2018-05-11 18:33:35

标签: python pandas

我有一个混合类型的数据集,需要转换为数字,同时仍保留字符类型数据中的信息。我目前的解决方案是在R中,但我现在需要将它转换为Python,因为接收此脚本的人不知道或想要转向学习R,这是可以理解的。是否可以使用Pandas库在Python中实现这一点?如果是这样,那么如何实现这一目标呢?

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 :(得分:1)

这是一个解决方案,它的主要部分是pd.get_dummies,它为您执行单热编码,带有参数errors = "coerce"的{​​{3}}方法会更改您的原始{ <1}}和x列以您想要的方式。

步骤如下:

1)使用y创建虚拟列,仅适用于您编码的列为数字的行。这是通过pd.get_dummies实现的,例如

2) pd.to_numeric()原始数据框的虚拟列

3)强制您的原始pd.get_dummies(df.x.loc[~df.x.str.isnumeric()], prefix='x')x数字类型,y当不可能时,最后替换NaN s与NaN

0