Python 检查一列值是否等于另一列';s名称,然后设置0或1

Python 检查一列值是否等于另一列';s名称,然后设置0或1,python,pandas,Python,Pandas,这是一个看似简单的问题,但我似乎无法理解 我有一个这样的数据帧 如果“animal”中的值是“cat”,我只希望“cat”列的值是1,对于“animal”列的其他值也是如此 以下是示例数据集: data = pd.DataFrame({'animal':['cat','cat', 'dog', 'fish'], 'cat':[0,0,0,0],'dog':[0,0,0,0],'fish':[0,0,0,0],'lion':[0,0,0,0]}) 问题是我不能简单地对值进行二值化,因为即使“l

这是一个看似简单的问题,但我似乎无法理解

我有一个这样的数据帧

如果“animal”中的值是“cat”,我只希望“cat”列的值是1,对于“animal”列的其他值也是如此

以下是示例数据集:

data = pd.DataFrame({'animal':['cat','cat', 'dog', 'fish'], 'cat':[0,0,0,0],'dog':[0,0,0,0],'fish':[0,0,0,0],'lion':[0,0,0,0]})
问题是我不能简单地对值进行二值化,因为即使“lion”不在我的列值中,它仍然作为一个二进制列存在。(二进制列已定义)

我在另一篇文章中找到了这个,但似乎不知道它是如何工作的

df.fillna('').apply(lambda x : x.index==x.name).astype(int).replace(0,"")
我的实际数据集有大约100个二进制列要循环


非常感谢您的帮助,谢谢

您可以使用
pd.get\u dummies()

您还可以在列中循环,查看该值是否等于该列。返回
True
False
。然后,只需调用
.astype(int)
即可分别转换为1和0

data = pd.DataFrame({'animal':['cat','cat', 'dog', 'fish'], 'cat':[0,0,0,0],'dog':[0,0,0,0],'fish':[0,0,0,0]})  
for col in data.columns[1:]:
    data[col] = (data['animal'] == col).astype(int)
data
Out[218]: 
  animal  cat  dog  fish
0    cat    1    0     0
1    cat    1    0     0
2    dog    0    1     0
3   fish    0    0     1

我知道答案已经贴出来了,但这里有一个使用你建议的行的方法

data.loc[:,data.columns != 'animal'].apply(lambda x : data["animal"]==x.name).astype(int)
首先,您首先调用所有不称为“animal”的列,因为您不需要替换它们。然后lambda函数遍历每一列,检查名称相同的情况。最后,“astype(int)”确保在所需条件为真的情况下,值显示为1

要获取带有动物名称的数据框,只需将其保存到变量中,如下所示:

data.loc[:,data.columns != 'animal'] = data.loc[:,data.columns != 'animal'].apply(lambda x : data["animal"]==x.name).astype(int)

Out:
      animal  cat  dog  fish
    0    cat    1    0     0
    1    cat    1    0     0
    2    dog    0    1     0
    3   fish    0    0     1

@xii我忘了提到如果你想在
pd.get_dummies()
示例中保留
animal
列,那么就做:
data[['animal']].join(pd.get_dummies(data['animal'])
data.loc[:,data.columns != 'animal'] = data.loc[:,data.columns != 'animal'].apply(lambda x : data["animal"]==x.name).astype(int)

Out:
      animal  cat  dog  fish
    0    cat    1    0     0
    1    cat    1    0     0
    2    dog    0    1     0
    3   fish    0    0     1