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