替换pandas.DataFrame中的缺失数据无法正常工作

时间:2014-07-24 23:02:29

标签: python pandas dataframe nan boolean-logic

我正在挖掘Kaggle's Titanic excercise

我有一个pandas.DataFrame,其中'Age'列分散了一些NaN'个值,另一列名为IsAlone我创建的值为10,具体取决于基于个人规则,这个人独自在那艘船上。

我正在尝试替换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值。

对此有何想法?

1 个答案:

答案 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()