如何在其他列满足特定条件的地方替换NaN值?

时间:2018-08-31 19:41:42

标签: python pandas kaggle

我正在研究Kaggle的泰坦尼克号数据集,并试图根据另一列中的信息替换NaN值。

在我的具体示例中,我试图用男性一等舱乘客的平均年龄来代替未知的男性一等舱乘客的年龄。

我该怎么做?

我已经能够分割数据并替换该新数据帧的空值,但是它不会延续到原始数据帧,因此我不清楚如何使它这样做。

这是我的代码:

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。

4 个答案:

答案 0 :(得分:2)

  

我正在尝试取代男性的头等舱乘客的未知年龄   男性一等舱乘客的平均年龄。

您可以将问题分为两个步骤。首先计算男性一等舱乘客的平均年龄:

mask = (df['Pclass'] == 1) & (df['Sex'] == 'male')
avg_filler = df.loc[mask, 'Age'].mean()

然后更新满足您条件的值:

df.loc[df['Age'].isnull() & mask, 'Age'] = avg_filler

答案 1 :(得分:1)

您可以按必填列和填充名对数据进行分组,例如

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

答案 2 :(得分:0)

我认为.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

答案 3 :(得分:0)

您只需选择其列满足特定条件的行,然后根据需要将其替换。

USE `inventory`;

LOAD DATA INFILE
'all_products.csv'
INTO TABLE `products`
    FIELDS
        TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '"'
    LINES
        TERMINATED BY ',\r\n'
IGNORE 1 ROWS
(`product_line`,`product_num`,`description`);