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

时间:2018-04-19 16:07:07

标签: python pandas dataframe categorical-data

我有一个数据框,并且想要检查“男性”或“女性”的字符串,如果数据框包含它们,则将替换为“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)

但是,我还要涵盖其他任何变体,如“男性”,“男性”,“男性”或“女性”,“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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

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

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