说我有一个像这样的数据框all_data
:
Id Zone Neighb
1 NaN IDOTRR
2 RL Veenker
3 NaN IDOTRR
4 RM Crawfor
5 NaN Mitchel
我想在“区域”(Zone)列中输入缺失的值,以便在“邻居”(Neighb)为“ IDOTRR”的情况下,将“区域”(Zone)设置为“ RM”,而在“邻居”(Neighb)为“ Mitchel”的情况下,我设置为“ RL”。
all_data.loc[all_data.MSZoning.isnull()
& all_data.Neighborhood == "IDOTRR", "MSZoning"] = "RM"
all_data.loc[all_data.MSZoning.isnull()
& all_data.Neighborhood == "Mitchel", "MSZoning"] = "RL"
我得到:
TypeError:无效的类型比较
C:\ Users \ pprun \ Anaconda3 \ lib \ site-packages \ pandas \ core \ ops.py:798:
FutureWarning:逐元素比较失败;返回标量
相反,但将来会进行元素比较
结果= getattr(x,名称)(y)
我敢肯定这应该很简单,但是我已经把它弄乱了太久了。请帮忙。
最佳答案
在Python中,&
优先于==
http://www.annedawson.net/Python_Precedence.htm
因此,当您执行all_data.MSZoning.isnull() & all_data.Neighborhood == "Mitchel"
时,将其解释为(all_data.MSZoning.isnull() & all_data.Neighborhood) == "Mitchel"
,现在Python尝试使用一个带有str系列的布尔系列,并查看它是否等于单个str AND
。解决方案是将测试括在括号中:"Mitchel"
。有时如果我有很多选择器,我会将它们分配给变量,然后(all_data.MSZoning.isnull()) & (all_data.Neighborhood == "Mitchel")
将它们分配给变量,例如:
null_zoning = all_data.MSZoning.isnull()
Mitchel_neighb = all_data.Neighborhood == "Mitchel"
all_data.loc[null_zoning & Mitchel_neighb, "MSZoning"] = "RL"
这不仅可以解决操作顺序问题,还意味着
AND
可以放在一行上。