卡在For循环中

jose.gp:

我不久之前开始编写代码,然后从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的common元素放在一个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.', ' Major.', ' Rev.', ' Lady.', ' Dr.'):    age = 47.5
        elif prefix in (' Don.', ' Jonkheer.', ' Mrs.', ' 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章