一个带有 pandas get_dummies 缺失值的热编码

one hot encode with pandas get_dummies missing values

我有一个 DataFrame 形式的数据集,每一行都有一个 1-5 范围内的标签。我正在使用 pd.get_dummies() 进行一次热编码。如果我的数据集包含所有 5 个标签,则没有问题。然而,并非所有集合都包含所有 5 个数字,因此编码只是跳过缺失值并为进入的新数据集造成问题。我可以设置一个范围以便一个热编码知道应该有 5 个标签吗?或者我是否必须在执行编码之前将 1,2,3,4,5 附加到数组的末尾,然后删除最后 5 个条目?

正确编码:值 1-5 已编码

arr = np.array([1,2,5,3,1,5,1,4])

df = pd.DataFrame(arr, columns = ['test'])
hotarr = np.array(pd.get_dummies(df['test']))

>>>[[1 0 0 0 0]
    [0 1 0 0 0]
    [0 0 0 0 1]
    [0 0 1 0 0]
    [1 0 0 0 0]
    [0 0 0 0 1]
    [1 0 0 0 0]
    [0 0 0 1 0]]

缺失值编码:此数据集缺少标签 4。

arr = np.array([1,2,5,3,1,5,1,])

df = pd.DataFrame(arr, columns = ['test'])
hotarr = np.array(pd.get_dummies(df['test']))

>>>[[1 0 0 0]
    [0 1 0 0]
    [0 0 0 1]
    [0 0 1 0]
    [1 0 0 0]
    [0 0 0 1]
    [1 0 0 0]]

在编码前设置 CategoricalDtype 以确保在获取虚拟对象时表示所有类别:

import numpy as np
import pandas as pd

arr = np.array([1, 2, 5, 3, 1, 5, 1])

df = pd.DataFrame(arr, columns=['test'])

# Setup Categorical Dtype
df['test'] = df['test'].astype(pd.CategoricalDtype(categories=[1, 2, 3, 4, 5]))
hotarr = np.array(pd.get_dummies(df['test']))

print(hotarr)

或者可以在 get_dummies 之后 reindexfill_value=0 添加缺少的列:

hotarr = np.array(pd.get_dummies(df['test'])
                  .reindex(columns=[1, 2, 3, 4, 5], fill_value=0))

尽管输入不包含 4:

,但两者都产生 5 列的 hotarr
[[1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 0 0 1]
 [0 0 1 0 0]
 [1 0 0 0 0]
 [0 0 0 0 1]
 [1 0 0 0 0]]