Pandas Dataframe 将具有两个值的分类列重新映射为二进制

Posted

技术标签:

【中文标题】Pandas Dataframe 将具有两个值的分类列重新映射为二进制【英文标题】:Pandas Dataframe remap categorical column with two values to binary 【发布时间】:2018-09-30 05:22:38 【问题描述】:

我有一个数据框进来,想检查“男性”或“女性”的字符串,如果数据框包含它们,它将被替换为“1”或“0”。感谢@Anand S Kumar's answer,目前我正在使用下面的代码。

if dataframe['gender']:
    dataframe['gender'].replace([0,1],['Female','Male'],inplace=True)
if dataframe['sex']:
    dataframe['sex'].replace([0,1],['Female','Male'],inplace=True)

但是,我还想涵盖任何其他变体,例如“男性”、“M”和“m”或“女性”、“F”、“f”,并且宁愿避免使用另外两个 if 语句对于每个变化。

我尝试过使用更大的列表,例如...

dataframe['gender'].replace([0,1,0,1,0,1,0,1],['Female','Male','male','female','M','F','m','f'],inplace=True)

一本字典...

dataframe['gender'].replace(0:'Female',1:'Male', 0:'female',1:'male',0:'F',1:'M',0:'f',1:'m',inplace=True)

但是得到了“系列的真值是模棱两可的”。两者都有 ValueError。

有没有人知道更好的方法,或者我目前的尝试做错了什么?

提前致谢!

编辑:我的 ValueError 是因为我的 if 语句含糊不清。我将其更改为if 'gender' in dataframe.columns: 来修复它。找到了修复here。

【问题讨论】:

【参考方案1】:

出于善意,假设您的列包含有效数据,为什么不根据每行的第一个字母替换?

m = 'm' : 1, 'f' : 0
df['gender'] = df['gender'].str[0].str.lower().map(m)

使用map,无效条目会自动强制转换为 NaN。

【讨论】:

工作得很好,无效的默认值 NaN 将有很大帮助。我需要更多地研究使用 map() 。感谢您的回答!【参考方案2】:

您可以使用.isin 过滤到多个值:

df[df["Gender"].isin(["MALE", "male", "Male", "m"])] = 1

【讨论】:

以上是关于Pandas Dataframe 将具有两个值的分类列重新映射为二进制的主要内容,如果未能解决你的问题,请参考以下文章

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python

连接具有重叠索引但从不重叠值的 Pandas DataFrame

查找具有 NaN 值的 DataFrame 列表的索引 - Pandas

将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame

pandas:将两个 DataFrame 与已排序的 MultiIndex 连接起来,使得结果具有已排序的 MultiIndex

Pandas - 重新索引仅对具有唯一值的索引对象有效