如何在其他列满足特定条件的情况下替换 NaN 值?
How to replace NaN values where the other columns meet a certain criteria?
我正在研究来自 Kaggle 的 titanic 数据集,并试图根据来自其他列的信息替换一列中的 NaN 值。
在我的具体示例中,我试图用男性第一 class 乘客的平均年龄替换男性第一 class 乘客的未知年龄。
我该怎么做?
我已经能够分割数据并替换该新数据帧的空值,但它不会延续到原始数据帧,我不太清楚如何做到这一点。
这是我的代码:
missingage_1stclass_male = pd.DataFrame(
titanic[
(titanic['Age'].isnull()) &
(titanic['Pclass'] == 1) &
(titanic['Sex'] == 'male')
]
)
missingage_1stclass_male.Age.fillna(40.5, inplace=True)
我包含所有值的原始数据框名为 titanic。
您可以按所需的列和填充对数据进行分组,例如
df['age'] = df.groupby(['pclass', 'sex']).age.apply(lambda x: x.fillna(x.mean()))
编辑:仅填充特定行的空值
df.loc[((df.pclass == 1) & (df.sex == 'male') & (df.age.isnull())) , 'age'] = df.loc[((df.pclass == 1) & (df.sex == 'male') ) , 'age'].mean()
我认为 .fillna() 可以帮助您解决这个问题
这里有一个如何使用的例子:
>>> df = pd.DataFrame([[np.nan, 2, np.nan, 0],
... [3, 4, np.nan, 1],
... [np.nan, np.nan, np.nan, 5],
... [np.nan, 3, np.nan, 4]],
... columns=list('ABCD'))
>>> df
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4
>>> df.fillna(0)
A B C D
0 0.0 2.0 0.0 0
1 3.0 4.0 0.0 1
2 0.0 0.0 0.0 5
3 0.0 3.0 0.0 4
您可以简单地 select 列满足特定条件的行,然后根据需要进行替换。
df[df['Pclass'] == 1 & df['Sex'] == 'male'].fillna(df['age'].mean())
I am trying to replace the unknown age of male, 1st class passengers
with the average age of male, 1st class passengers.
您可以将问题分为 2 个步骤。首先计算男性,第1class位乘客的平均年龄:
mask = (df['Pclass'] == 1) & (df['Sex'] == 'male')
avg_filler = df.loc[mask, 'Age'].mean()
然后更新满足您条件的值:
df.loc[df['Age'].isnull() & mask, 'Age'] = avg_filler
我正在研究来自 Kaggle 的 titanic 数据集,并试图根据来自其他列的信息替换一列中的 NaN 值。
在我的具体示例中,我试图用男性第一 class 乘客的平均年龄替换男性第一 class 乘客的未知年龄。
我该怎么做?
我已经能够分割数据并替换该新数据帧的空值,但它不会延续到原始数据帧,我不太清楚如何做到这一点。
这是我的代码:
missingage_1stclass_male = pd.DataFrame(
titanic[
(titanic['Age'].isnull()) &
(titanic['Pclass'] == 1) &
(titanic['Sex'] == 'male')
]
)
missingage_1stclass_male.Age.fillna(40.5, inplace=True)
我包含所有值的原始数据框名为 titanic。
您可以按所需的列和填充对数据进行分组,例如
df['age'] = df.groupby(['pclass', 'sex']).age.apply(lambda x: x.fillna(x.mean()))
编辑:仅填充特定行的空值
df.loc[((df.pclass == 1) & (df.sex == 'male') & (df.age.isnull())) , 'age'] = df.loc[((df.pclass == 1) & (df.sex == 'male') ) , 'age'].mean()
我认为 .fillna() 可以帮助您解决这个问题
这里有一个如何使用的例子:
>>> df = pd.DataFrame([[np.nan, 2, np.nan, 0],
... [3, 4, np.nan, 1],
... [np.nan, np.nan, np.nan, 5],
... [np.nan, 3, np.nan, 4]],
... columns=list('ABCD'))
>>> df
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4
>>> df.fillna(0)
A B C D
0 0.0 2.0 0.0 0
1 3.0 4.0 0.0 1
2 0.0 0.0 0.0 5
3 0.0 3.0 0.0 4
您可以简单地 select 列满足特定条件的行,然后根据需要进行替换。
df[df['Pclass'] == 1 & df['Sex'] == 'male'].fillna(df['age'].mean())
I am trying to replace the unknown age of male, 1st class passengers with the average age of male, 1st class passengers.
您可以将问题分为 2 个步骤。首先计算男性,第1class位乘客的平均年龄:
mask = (df['Pclass'] == 1) & (df['Sex'] == 'male')
avg_filler = df.loc[mask, 'Age'].mean()
然后更新满足您条件的值:
df.loc[df['Age'].isnull() & mask, 'Age'] = avg_filler