如何解决卡在For循环中
不久前我开始编写代码,然后从Kaggle跳进了Titanic练习。我试图将某些乘客的年龄的Nan值更改为我认为适合其前缀的年龄(先生,女士,主人...)。
试图做一个for循环,但似乎不起作用,因为它给Age中Nan值的每个人都赋予相同的值,而不管其前缀如何。我在做什么错,我该怎么做?
import math
for i in range(len(database)):
if math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Capt.' or database['Prefix'][i] == ' Col.':
database['Age'] = 65.0
elif math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Sir.' or database['Prefix'][i] == ' Major.' or database['Prefix'][i] == ' Rev.' or database['Prefix'][i] == ' Lady.' or database['Prefix'][i] == ' Dr.':
database['Age'] = 47.5
elif math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Don.' or database['Prefix'][i] == ' Jonkheer.' or database['Prefix'][i] == ' Mrs.' or database['Prefix'][i] == ' the Countess.':
database['Age'] = 36.5
elif math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Mr.' or database['Prefix'][i] == ' Ms.':
database['Age'] = 29.0
elif math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Mme.' or database['Prefix'][i] == ' Mlle.':
database['Age'] = 24.0
elif math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Miss.':
database['Age'] = 21.0
elif math.isnan(database['Age'][i]) == True and database['Prefix'][i] == ' Master.':
database['Age'] = 3.5
这是在for循环之前: Titanic1.py 这是在for循环之后: Titanic2.py
非常感谢!
解决方法
关于代码的一些问题可以解决。
首先,我们将所有if / elifs的公共元素放在一个if中:
import math
for i in range(len(database)):
if math.isnan(database['Age'][i]) == True:
if database['Prefix'][i] == ' Capt.' or database['Prefix'][i] == ' Col.':
database['Age'] = 65.0
elif database['Prefix'][i] == ' Sir.' or database['Prefix'][i] == ' Major.' or database['Prefix'][i] == ' Rev.' or database['Prefix'][i] == ' Lady.' or database['Prefix'][i] == ' Dr.':
database['Age'] = 47.5
elif database['Prefix'][i] == ' Don.' or database['Prefix'][i] == ' Jonkheer.' or database['Prefix'][i] == ' Mrs.' or database['Prefix'][i] == ' the Countess.':
database['Age'] = 36.5
elif database['Prefix'][i] == ' Mr.' or database['Prefix'][i] == ' Ms.':
database['Age'] = 29.0
elif database['Prefix'][i] == ' Mme.' or database['Prefix'][i] == ' Mlle.':
database['Age'] = 24.0
elif database['Prefix'][i] == ' Miss.':
database['Age'] = 21.0
elif database['Prefix'][i] == ' Master.':
database['Age'] = 3.5
然后,通过将其保存到变量中,我们将摆脱所有的database["Prefix"][i]
检查,并使用in
运算符来避免许多prefix == "something" or prefix == "something else"
。
for i in range(len(database)):
if math.isnan(database['Age'][i]) == True:
prefix = database['Prefix'][i]
if prefix in (' Capt.',' Col.'):
database['Age'] = 65.0
elif prefix in (' Sir.',' Major.',' Rev.',' Lady.',' Dr.'):
database['Age'] = 47.5
elif prefix in (' Don.',' Jonkheer.',' Mrs.',' the Countess.'):
database['Age'] = 36.5
elif prefix (' Mr.',' Ms.'):
database['Age'] = 29.0
elif prefix (' Mme.',' Mlle.'):
database['Age'] = 24.0
elif prefix == ' Miss.':
database['Age'] = 21.0
elif prefix == ' Master.':
database['Age'] = 3.5
然后,请注意,您在修改database["Age"]
而不是database["Age"][i]
的地方,因此我们也将对其进行修复。
for i in range(len(database)):
if math.isnan(database['Age'][i]) == True:
prefix = database['Prefix'][i]
if prefix in (' Capt.',' Col.'): age = 65.0
elif prefix in (' Sir.',' Dr.'): age = 47.5
elif prefix in (' Don.',' the Countess.'): age = 36.5
elif prefix (' Mr.',' Ms.'): age = 29.0
elif prefix (' Mme.',' Mlle.'): age = 24.0
elif prefix == ' Miss.': age = 21.0
elif prefix == ' Master.': age = 3.5
database['Age'][i] = age
最后,如果需要的话,您可以为自己编写一个字典,该字典将前缀与年龄进行匹配,并使用它来避免许多if和elifs。
# Define how an age is matched with some prefixes.
ages_and_prefixes = ((65.0,("Capt","Col")),(47.5,("Sir","Major","Rev","Lady","Dr")),(36.5,("Don","Jonkheer","Mrs","the Countess")),(29.0,("Mr","Ms")),(24.0,("Mme","Mlle")),(21.0,("Miss",)),(3.5,("Master",))
)
prefix_to_age_dict = {}
for data in ages_and_prefixes:
age = data[0]
prefixes = data[1]
for prefix in prefixes:
prefix_to_age_dict[prefix] = age
# The replacement step in the database is now much simpler.
for i in range(len(database)):
if math.isnan(database['Age'][i]):
prefix = " " + database['Prefix'][i] + "."
age = prefix_to_age_dict[prefix]
database['Age'][i] = age
,
这里带有map的版本比更长的for循环更易于阅读:
prefix_dict = {" Capt.": 65.0," Col.": 65.0," Sir.": 47.5," Major.": 47.5," Rev.": 47.5," Lady.": 47.5," Dr.": 47.5," Don.": 36.5," Jonkheer.": 36.5," Mrs.": 36.5," the Countess.": 36.5," Mr.": 29.0," Ms.": 29.0," Mme.": 24.0," Mlle.": 24.0," Miss.": 21.0," Master.": 3.5
}
database.loc[database["Age"].isna(),'Age'] = database.loc[database["Age"].isna(),'Prefix'].map(lambda x: prefix_dict[x])
.isna()
仅过滤n / a个值,而.map(lambda x: prefix_dict[x])
则获取列中的每个值并从字典中返回相关值。
您无法分配值,例如database['Age'] = 65.0
。这将用65.0替换每个记录的“年龄”值。因此,在i
的其余部分中,math.isnan(database['Age'][i]) == True
将始终为False,因为列Age
不再具有NaN
。
我建议您使用df.iterrows()
遍历数据帧,并使用df.at
将值分配给记录的特定单元格。下面的代码应该可以工作。
for i,row in database.iterrows():
if math.isnan(database['Age'][i]) == True:
if database['Prefix'][i] == ' Capt.' or database['Prefix'][i] == ' Col.':
age = 65.0
elif database['Prefix'][i] == ' Sir.' or database['Prefix'][i] == ' Major.' or database['Prefix'][i] == ' Rev.' or database['Prefix'][i] == ' Lady.' or database['Prefix'][i] == ' Dr.':
age = 47.5
elif database['Prefix'][i] == ' Don.' or database['Prefix'][i] == ' Jonkheer.' or database['Prefix'][i] == ' Mrs.' or database['Prefix'][i] == ' the Countess.':
age = 36.5
elif database['Prefix'][i] == ' Mr.' or database['Prefix'][i] == ' Ms.':
age = 29.0
elif database['Prefix'][i] == ' Mme.' or database['Prefix'][i] == ' Mlle.':
age = 24.0
elif database['Prefix'][i] == ' Miss.':
age = 21.0
elif database['Prefix'][i] == ' Master.':
age = 3.5
database.at[i,'Age'] = age
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。