Python 如何替换pandas中数据帧列中的NaN值?
我是熊猫图书馆的新手,试图利用熊猫对泰坦尼克号的生存数据进行一些分析。 在数据集中,年龄列中的某些单元格没有值,因此它们在数据框中显示为“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" ]['
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中男性的年龄值。