如何在pandas中的数据框中替换列中的NaN值?

时间:2015-06-29 11:25:16

标签: python numpy

我是熊猫图书馆的新手,并尝试使用熊猫对泰坦尼克号的生存数据进行一些分析。 在数据集中,Age列中有一些单元格没有值,因此它们在数据框中显示为“NaN”。 所以我试图用男性的平均男性年龄和女性的女性年龄的平均值来取代这些细胞。 首先我试过这个

df[ df.Sex == "male"]['Age'].fillna( df[ df.Sex == "male" ]['Age'].mean())

当它稍后打印时,它可以工作,但不会更改数据框中单元格的值,所以我尝试了这个

df[ df.Sex == "male"]['Age'].fillna( df[ df.Sex == "male" ]['Age'].mean(),inplace = True)

并收到此错误消息

/anaconda3/lib/python3.4/site-packages/pandas/core/generic.py:2602: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self._update_inplace(new_data)

所以任何人都知道如何有效地做到这一点?

4 个答案:

答案 0 :(得分:0)

你在做什么是正确的。你只需要重新分配给df:

df['Age'] = df['Age'].replace(df[(df['Sex']=='male') & (df['Age'].isnull())]['Age'], df['Age'].mean)

答案 1 :(得分:0)

您应该将fillna(不带inplace参数)的返回值保存在临时变量中,然后遍历其中的索引并更改df中的每个索引

tempdf = df[ df.Sex == "male"]['Age'].fillna( df[ df.Sex == "male" ]['Age'].mean())
for i in  tempdf.index:
    df['Age'][i] = tempdf[i]

答案 2 :(得分:0)

fillna()接受带有列名和值的字典,以替换NaN。每列中的NaN将替换为相应的值。 请注意,如果您未指定df,则其他列和原始inplace=True数据框不会受到影响。

replacement_value = df[ df.Sex == "male" ]['Age'].mean()
new_df = df.fillna({'Age': replacement_value})

您当然可以覆盖现有的数据框:

df = df.fillna({'Age': replacement_value})
# or just df.fillna({'Age': replacement_value}, inplace=True)

答案 3 :(得分:0)

试试这个

# Fill the nan values with the mean age
df['Age'] = df.groupby('Sex')['Age'].transform(lambda grp: grp.fillna(np.mean(grp)))

df

Output Sample of Age

here获得