说我有一个像这样的数据框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可以放在一行上。

10-06 11:14