Python pandas-基于另一列更改列中的值

Python pandas-基于另一列更改列中的值,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个dataframe所有数据,如下所示: 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',我将其设置

假设我有一个dataframe
所有数据
,如下所示:

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: 未来警告:元素级比较失败;返回标量 相反,但将来将执行元素级比较
结果=getattr(x,name)(y)

我相信这应该很简单,但我已经在这上面混了太久了。请帮忙

使用np.select,即

df['Zone'] = np.select([df['Neighb'] == 'IDOTRR',df['Neighb'] == 'Mitchel'],['RM','RL'],df['Zone'])
使用np.select,即

df['Zone'] = np.select([df['Neighb'] == 'IDOTRR',df['Neighb'] == 'Mitchel'],['RM','RL'],df['Zone'])

在Python中,
&
优先于
=

因此,当您执行
all_data.MSZoning.isnull()&all_data.neighborary==“Mitchel”
,这被解释为
(all_data.MSZoning.isnull()&all_data.neighborary)==“Mitchel”
,现在Python尝试
带有str序列的布尔序列,并查看它是否等于单个str
“Mitchel”
。解决方案是将测试括在括号中:
(all_data.MSZoning.isnull())和(all_data.neighborary==“Mitchel”)
。有时,如果我有很多选择器,我会将它们分配给变量,然后
它们,例如:

null_zoning = all_data.MSZoning.isnull()
Mitchel_neighb = all_data.Neighborhood == "Mitchel"
all_data.loc[null_zoning & Mitchel_neighb, "MSZoning"] = "RL"

这不仅解决了操作顺序问题,还意味着
所有数据。loc[null\u zoning&Mitchel\u neighb,“MSZoning”]=“RL”
适合一行。

在Python中,
&
优先于
=

df.Zone=df.Zone.fillna(df.Neighb.replace({'IDOTRR':'RM','Mitchel':'RL'}))
df
Out[784]: 
   Id Zone   Neighb
0   1   RM   IDOTRR
1   2   RL  Veenker
2   3   RM   IDOTRR
3   4   RM  Crawfor
4   5   RL  Mitchel

因此,当您执行
all_data.MSZoning.isnull()&all_data.neighborary==“Mitchel”
,这被解释为
(all_data.MSZoning.isnull()&all_data.neighborary)==“Mitchel”
,现在Python尝试
带有str序列的布尔序列,并查看它是否等于单个str
“Mitchel”
。解决方案是将测试括在括号中:
(all_data.MSZoning.isnull())和(all_data.neighborary==“Mitchel”)
。有时,如果我有很多选择器,我会将它们分配给变量,然后
它们,例如:

null_zoning = all_data.MSZoning.isnull()
Mitchel_neighb = all_data.Neighborhood == "Mitchel"
all_data.loc[null_zoning & Mitchel_neighb, "MSZoning"] = "RL"

这不仅解决了操作顺序问题,还意味着
所有数据.loc[null\u zoning&Mitchel\u neighb,“MSZoning”]=“RL”
可以放在一行上。

非常感谢,这工作非常好。但是,不可能为了同样的目的使用
.loc
。.loc使事情变得复杂,所以我使用了更快更有效的np.select。如果你有更多的条件让我知道。我会更新这么多的,这是完美的工作。但是,不可能为了同样的目的使用
.loc
。.loc使事情变得复杂,所以我使用了更快更有效的np.select。如果你有更多的条件让我知道。我将把测试用括号括起来:
(all_data.MSZoning.isnull())和(all_data.neighbory==“IDOTRR”)
@accumulation,谢谢你把测试用括号括起来:
(all_data.MSZoning.isnull())和(all_data.neighbory==“IDOTRR”)
@accumulation,谢谢你开箱思考,做OP想要的+1。这是开箱思考,做OP想要的+1。
df.Zone=df.Zone.fillna(df.Neighb.replace({'IDOTRR':'RM','Mitchel':'RL'}))
df
Out[784]: 
   Id Zone   Neighb
0   1   RM   IDOTRR
1   2   RL  Veenker
2   3   RM   IDOTRR
3   4   RM  Crawfor
4   5   RL  Mitchel