熊猫单热编码列到假人,包括“其他”编码[重复]

Posted

技术标签:

【中文标题】熊猫单热编码列到假人,包括“其他”编码[重复]【英文标题】:Pandas one-hot-encode columns to dummies, including an 'other' encoding [duplicate] 【发布时间】:2021-10-06 21:43:39 【问题描述】:

我的最终目标是在 Pandas 列上进行一次热编码。 在这种情况下,我想按如下方式对列“b”进行一次热编码:保留苹果、香蕉和橙子,并将任何其他水果编码为“其他”。

示例:在下面的代码中,“grapefruit”将被重写为“other”,如果“kiwi”和“avocado”出现在我的数据中,它们也将被重写。

以下代码有效:

df = pd.DataFrame(
    "a": [1,2,3,4,5],
    "b": ["apple", "banana", "banana", "orange", "grapefruit"],
    "c": [True, False, True, False, True],
)
print(df)

def analyze_fruit(s):
    if s in ("apple", "banana", "orange"):
        return s
    else:
        return "other"

df['b'] = df['b'].apply(analyze_fruit)

df2 = pd.get_dummies(df['b'], prefix='b')
print(df2)

我的问题:有没有更短的方法来做analyze_fruit() 业务?我尝试了DataFrame.replace(),但没有成功。

【问题讨论】:

~df['b'].isin(['apple','banana','orange']) 有用 链接问题的副本。另一种方式是sklearn.preprocessing.OneHotEncoder(..., drop=None) 也会生成假人。首先,整理您的数据以创建“其他”分类级别/列。 【参考方案1】:

您可以在get_dummies 之前设置Categorical,然后fillna 任何与设置的类别不匹配的内容都将变为NaNfillna 可以轻松填充。分类的另一个好处是排序也可以在这里定义,方法是添加ordered=True

df['b'] = pd.Categorical(
    df['b'],
    categories=['apple', 'banana', 'orange', 'other']
).fillna('other')

df2 = pd.get_dummies(df['b'], prefix='b')

np.where 之类的标准替换也可以在这里使用,但通常虚拟变量与分类数据一起使用,因此能够添加排序以便虚拟列以固定顺序显示会很有帮助:

# import numpy as np


df['b'] = np.where(df['b'].isin(['apple', 'banana', 'orange']),
                   df['b'],
                   'other')

df2 = pd.get_dummies(df['b'], prefix='b')

两者都产生df2:

   b_apple  b_banana  b_orange  b_other
0        1         0         0        0
1        0         1         0        0
2        0         1         0        0
3        0         0         1        0
4        0         0         0        1

【讨论】:

HenryEcker:是的,对不起,我的大脑漏水了。是的,这是正确的。 顺便说一下,如果您从 pd.read_csv 中读取列 'b',则可以直接将水果列 'b' 读取为分类(然后每个水果将获得自己的分类级别。您然后对其进行后处理,将禁果组合成一个“其他”级别)。 其实sklearn.preprocessing.OneHotEncoder(..., drop=None)也会生成假人。

以上是关于熊猫单热编码列到假人,包括“其他”编码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

缺少类别的单热编码

python 提取单热编码向量。

如何在单热编码中修复“索引 3 超出轴 1 大小为 3 的范围”? [复制]

“特征重要性”的“单热编码”变量的显示名称

pd.get_dummies 是单热编码吗?

使用单热编码处理sklearn中的分类变量