Pandas 检查列值是否等于另一列的名称,然后设置 0 或 1

这是一个看似简单的问题,但我似乎无法弄清楚。

我有一个像这样的数据框

https://img1.sycdn.imooc.com/654cde780001b27602600161.jpg

如果“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 个二进制列需要循环。

任何帮助表示感谢,谢谢!


慕哥6287543
浏览 68回答 2
2回答

繁花如伊

我知道答案已经发布,但这是使用您建议的行的方法。data.loc[:,data.columns != 'animal'].apply(lambda x : data["animal"]==x.name).astype(int)首先,您首先调用所有不称为“动物”的列,因为您不需要替换它们。然后 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

largeQ

您可以使用pd.get_dummies():data = pd.DataFrame({'animal':['cat','cat', 'dog', 'fish'], 'cat':[0,0,0,0],'dog':[0,0,0,0],'fish':[0,0,0,0]})  data = pd.get_dummies(data['animal'])# To keep animal column use: data = data[['animal']].join(pd.get_dummies(data['animal']))dataOut[1]:    cat  dog  fish0    1    0     01    1    0     02    0    1     03    0    0     1您还可以循环遍历列并查看该值是否等于该列。返回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)dataOut[218]:   animal  cat  dog  fish0    cat    1    0     01    cat    1    0     02    dog    0    1     03   fish    0    0     1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python