繁体   English   中英

如何在 python 中对数字进行一次热编码?

[英]How to One Hot Encode in python for numerical?

我是 python 的新手,并试图了解如何使用 scikitlearn

我有一个 dataframe:

         Id        ServiceSubCodeKey  ...         Aim   PrintDate
0        1895650                  2  ...          NaN  2018-07-27
1        1895650                  4  ...          NaN  2018-08-13
2        1896355                  2  ...          NaN  2018-08-10
3        1897675                  9  ...         12.0  2018-08-13
4        1897843                  2  ...          NaN  2018-08-10
         ...                ...  ...          ...         ...
3940510  2178737                 3  ...          1.0  2019-06-14
3940511  2178737                 4  ...          1.0  2019-06-14
3940512  2178737                 7  ...          1.0  2019-06-14
3940513  2178737                 1  ...          1.0  2019-06-14
3940514  2178750                 6  ...          4.0  2019-06-14

我正在尝试根据 id vs servicesubcodekey 对 300 万行进行热编码,以便最终的 One 热编码如下所示:

           id   ServiceSubCodeKey  ...           Encoding   PrintDate
0        1895650                  2  ...          0101          2018-07-27
1        1895650                  4  ...          0101          2018-08-13
2        1896355                  2  ...          01          2018-08-10
3        1897675                  9  ...          000000001   2018-08-13
4        1897843                  2  ...          01          2018-08-10
         ...                ...  ...          ...         ...
3940510  2178737                 3  ...          1011001         2019-06-14
3940511  2178737                 4  ...          1011001         2019-06-14
3940512  2178737                 7  ...          1011001     2019-06-14
3940513  2178737                 1  ...          1011001     2019-06-14
3940514  2178750                 6  ...           000001      2019-06-14

因此,正如您所看到的,对于每个具有服务子代码的 id,都有一个唯一的编码,如果 id 相同,则编码是服务子代码的范围,如果最大服务子代码,它会为数字打开,例如 id 18为 4,则编码为 0101,因为该 id 存在 2 和 4。

我想我能够为此生成一种方法:

import pandas as pd
from operator import add
df = pd.DataFrame([
[1895650,2,float("nan"),  "2018-07-27"],
[1895650,4,float("nan"),  "2018-08-13"],
[1896355,2,float("nan"),  "2018-08-10"],
[1897675,9,12.0 ,"2018-08-13"],
[1897843,2,float("nan"),"2018-08-10"],
[2178737,3,1.0,  "2019-06-14"],
[2178737,4,1.0, "2019-06-14"],
[2178737,7,1.0 , "2019-06-14"],
[2178737,1,1.0 , "2019-06-14"],
[2178750,6,4.0 , "2019-06-14"]],columns = ["Id","ServiceSubCodeKey","Aim","PrintDate"])

首先,我们对分类变量进行一次热编码并将它们放在一起:

columns = pd.get_dummies(df["ServiceSubCodeKey"]).astype(str)
df2 = columns[1]
for col in columns.columns[1::]:
    df2 += columns[col]

然后我们将它们添加到我们的原始数据集中:

df3 = pd.concat([df, df2], axis=1)
df3[1] = df3[1].apply(lambda x: list(map(int, list(x))))

我们将列表组合在一起并将它们相加:

df4 = df3[["Id",1]].groupby("Id").agg(lambda x: sum_l(x)).reset_index()
df4[1] = df4[1].apply(lambda x: sum_l2(x))
df4[1] = df4[1].apply(lambda x: f(x))
df4[1] = df4[1].apply(lambda x: ''.join(list(map(str, list(x)))))

最后加入他们:

df5 = pd.merge(df,df4, on="Id", how="left")
df5

    Id      ServiceSubCodeKey   Aim     PrintDate   1
0   1895650 2                   NaN     2018-07-27  0101
1   1895650 4                   NaN     2018-08-13  0101
2   1896355 2                   NaN     2018-08-10  01
3   1897675 9                   12.0    2018-08-13  0000001
4   1897843 2                   NaN     2018-08-10  01
5   2178737 3                   1.0     2019-06-14  101101
6   2178737 4                   1.0     2019-06-14  101101
7   2178737 7                   1.0     2019-06-14  101101
8   2178737 1                   1.0     2019-06-14  101101
9   2178750 6                   4.0     2019-06-14  00001

我们还需要以下功能:

def sum_l(values):
    out = []
    for element in values:
        out.append(element)
    return out

def sum_l2(values):
    
    if type(values[0]) != int:
        out = values[0]
        for i in range(1,len(values)):
            out = list(map(add, out, values[i]))
    else:
        out = values
    return out

def f(x):
    while x[-1] == 0:
        x.pop()
    return x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM