熊猫单热编码列到假人,包括“其他”编码[重复]
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
任何与设置的类别不匹配的内容都将变为NaN
,fillna
可以轻松填充。分类的另一个好处是排序也可以在这里定义,方法是添加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)
也会生成假人。以上是关于熊猫单热编码列到假人,包括“其他”编码[重复]的主要内容,如果未能解决你的问题,请参考以下文章