在pandas中根据另一列的值创建新列

时间:2016-09-19 01:58:45

标签: python pandas

我有一些关于不同个体性别的数据集。比如,数据集如下所示:

Male
Female
Male and Female
Male
Male
Female
Trans
Unknown
Male and Female

有些人认为自己是男性,有些是女性,有些人认为自己是男性和女性。

现在,我想要做的是在Pandas中创建一个映射

的新列
Males to 1, 
Females to 2,
Others to 3

我写了一些代码

def gender(x):
    if x.str.contains("Male")
        return 1
    elif x.str.contains("Female")
        return 2
    elif return 3

df["Gender Values"] = df["Gender"].apply(gender)

但是我收到的错误是函数不包含任何属性。我尝试删除str:

x.contains("Male")

我得到同样的错误

有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

您可以使用:

def gender(x):
    if "Female" in x and "Male" in x:
        return 3
    elif "Male" in x:
        return 1
    elif "Female" in x:
        return 2
    else: return 4

df["Gender Values"] = df["Gender"].apply(gender)

print (df)
            Gender  Gender Values
0             Male              1
1           Female              2
2  Male and Female              3
3             Male              1
4             Male              1
5           Female              2
6            Trans              4
7          Unknown              4
8  Male and Female              3

答案 1 :(得分:1)

创建一个映射函数,并使用它来映射值。

def map_identity(identity):
    if gender.lower() == 'male':
        return 1
    elif gender.lower() == 'female':
        return 2
    else: 
        return 3

df["B"] = df["A"].map(map_identity)

答案 2 :(得分:0)

如果没有具体要求分别按顺序将1、2、3分别用于男性,女性和其他人,则可以尝试使用Scikit-Learn的LabelEncoder。它将为该列中的每个唯一类别随机分配一个唯一编号。

my $sock = IO::Socket::SSL->new(
    PeerAddr => '2.50.44.55:5061',
    SSL_fingerprint => 'sha1$CE68626830EAF46482F55CB7FBF4DA1B77889FDD'
) or die $SSL_ERROR;

有关详细信息,您可以查看Label Encoder文档。

希望这会有所帮助!