我正在挖掘Kaggle's Titanic excercise。
我有一个pandas.DataFrame,其中'Age'列分散了一些NaN'
个值,另一列名为IsAlone
我创建的值为1
或0
,具体取决于基于个人规则,这个人独自在那艘船上。
我正在尝试替换NaN
列上的Age
值,用于单独与平均年龄相同的人,与那些并不孤独的人一样。目的只是运用pandas DataFrame,根据规则替换NaN
值。
我正在为那些独自一人做这件事:
df_train[(df_train.IsAlone.astype(bool) & df_train.Age.isnull() )].Age = \
df_train[(df_train.IsAlone.astype(bool) & ~df_train.Age.isnull() )].Age.mean()
对于那些并不孤单的人也一样:
df_train[(~df_train.IsAlone.astype(bool) & df_train.Age.isnull() )].Age = \
df_train[(~df_train.IsAlone.astype(bool) & ~df_train.Age.isnull() )].Age.mean()
但这根本不起作用,列Age
仍然具有相同的NaN
值。
对此有何想法?
答案 0 :(得分:1)
问题是在原始帧的副本上更改了值。有关详细信息,请参阅Returning a view versus a copy。如在文档中:
在pandas对象中设置值时,必须注意避免所谓的链式索引。
要更改原始帧的视图上的值,您可以执行以下操作:
j = df_train.IsAlone.astype(bool) & df_train.Age.isnull()
i = df_train.IsAlone.astype(bool) & ~df_train.Age.isnull()
df_train.loc[j, 'Age'] = df_train.loc[i, 'Age'].mean()