Python 检查一列值是否等于另一列';s名称,然后设置0或1
这是一个看似简单的问题,但我似乎无法理解 我有一个这样的数据帧 如果“animal”中的值是“cat”,我只希望“cat”列的值是1,对于“animal”列的其他值也是如此 以下是示例数据集: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
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