这里是Python新手。我希望我的问题不是完全多余的 - 如果是,请让我知道并将其归结为我对StackOverflow的经验不足。
无论如何,我正在使用来自kaggle.com的Titanic数据集,并且我希望使用一组条件语句来代替NaN'值'整个数据框的Age列。最后,我想根据以下条件生成结果: 1)如果年龄== NaN,并且标题==(X或Y或Z),则生成0-18范围内的随机数 2)如果年龄== NaN,并且标题==(A或B或C),则生成19-80范围内的随机数
注意:'标题'是一个列出个人名称的专栏(即Mr.,Mrs.,Lord等)
我发现了类似的情况here,但我还没有能够适应我的情况,因为它根本没有接近条件。
这是我最近的尝试(根据此次更新的回复)
尝试1
import random
mask_young = (df.Age.isnull()) & (df.Title.isin(Title_Young))
df.loc[mask_young, 'Age'] = df.loc[mask_young, 'Age'].apply(lambda x: np.random.randint(0,18))
mask_old = (df.Age.isnull()) & (df.Title.isin(Title_Old))
df.loc[mask_old, 'Age'] = df.loc[mask_old, 'Age'].apply(lambda x: np.random.randint(18,65))
mask_all = (df.Age.isnull()) & (df.Title.isin(Title_All))
df.loc[mask_all, 'Age'] = df.loc[mask_all, 'Age'].apply(lambda x: np.random.randint(0,65))
结果没有错误,但没有更正“年龄”中的NaN值。柱
答案 0 :(得分:4)
您希望屏蔽您的DataFrame,然后仅对符合您条件的DataFrame部分执行操作。
import numpy as np
import pandas as pd
mask1 = (df.Age.isnull()) & (df.Title == 'Master')
df.loc[mask1, 'Age'] = df.loc[mask1, 'Age'].apply(lambda x: np.random.randint(0,18))
如果您确实需要在列表中包含多个标题的功能,可以通过定义您关注的标题列表然后使用isin
来完成。例如:
list1 = ['Master', 'Sir', 'Mr']
mask1 = (df.Age.isnull()) & (df.Title.isin(list1))