Python 如何替换pandas中数据帧列中的NaN值?

Python 如何替换pandas中数据帧列中的NaN值?,python,numpy,Python,Numpy,我是熊猫图书馆的新手,试图利用熊猫对泰坦尼克号的生存数据进行一些分析。 在数据集中,年龄列中的某些单元格没有值,因此它们在数据框中显示为“NaN”。 所以我试图用男性的平均年龄和女性的平均年龄来代替这些细胞。 首先我试过这个 df[ df.Sex == "male"]['Age'].fillna( df[ df.Sex == "male" ]['Age'].mean()) df[ df.Sex == "male"]['Age'].fillna( df[ df.Sex == "male" ]['

我是熊猫图书馆的新手,试图利用熊猫对泰坦尼克号的生存数据进行一些分析。 在数据集中,年龄列中的某些单元格没有值,因此它们在数据框中显示为“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)
好吧,它可以工作,但是当我稍后打印它时,不会改变数据框中单元格的值,所以我尝试了这个

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:试图在数据帧切片的副本上设置值请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-查看与复制自己。\更新\就地(新数据)


所以有人知道如何有效地做吗?

你所做的是正确的。您只需将其重新分配给df:

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

你所做的是对的。您只需将其重新分配给df:

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

您应该将
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]

您应该将
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]
fillna()
接受带有列名和值的字典,以替换
NaN
<每列中的code>NaN将替换为相应的值。 请注意,如果不指定
inplace=True
,则其他列和原始
df
数据帧将不受影响

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)
fillna()
接受带有列名和值的字典,以替换
NaN
<每列中的code>NaN将替换为相应的值。 请注意,如果不指定
inplace=True
,则其他列和原始
df
数据帧将不受影响

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)

试着用这个

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

试着用这个

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

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

df

获得,试试这个

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

df


中得到的,这将使许多其他值NaN,不是吗?感谢您快速回复,但这样做时,我似乎丢失了原始数据帧,在赋值之后,DFT中似乎只有一列会使许多其他值NaN,不是吗?感谢您快速回复,但是,当我这样做时,似乎丢失了原始数据帧,在分配之后,DFT中似乎只有一列。这没有改变df中男性的年龄值。这没有改变df中男性的年龄值。