df.fillna() 从切片更新多列时不起作用

df.fillna() not working when updating multiple columns from a slice

fillna() 和 df 切片有问题。我的 python 训练轮还在,如果有任何帮助,我们将不胜感激。我在 SE 上找到了很多接近的例子,但是由于条件和多列我没有找到任何适用于这种情况的例子。

数据: 高级回归补偿:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

但是,不需要像我那样下拉并组合训练和测试数据,因为该切片仅包含 garage_cat_columns 中列出的 columns/factors 的约 150 np.nan 行。

Id 列是 1 到 3000 之间的整数

# Columns to update and criteria to slice

garage_cat_columns = ['GarageType','GarageYrBlt','GarageQual','GarageCond','GarageFinish']
no_garage = testing.Id[((testing['GarageType'].isnull()) &
                        (testing['GarageYrBlt'].isnull()) &
                        (testing['GarageQual'].isnull()) &
                        (testing['GarageCond'].isnull()) &
                        (testing['GarageFinish'].isnull()))].tolist() # are all null?

# Best of my knowledge this is textbook (old text book) fillna()

testing[testing.Id.where(df.Id.isin(no_garage)).notnull()][garage_cat_columns].fillna("None", inplace=True)

我收到“切片副本”警告(意料之中),但似乎无法找到将其写回原始数据框的方法,因此我的更改将“提交”。

一些失败的尝试:

# 1 tried with and without double brackets

testing[[garage_cat_columns]] = testing[testing['Id'].where(df['Id']isin(no_garage)).notnull()] \
        [garage_cat_columns] = 'None'

# 2 

testing[testing['Id'].where(df['Id']isin(no_garage)).notnull()][garage_cat_columns] = 'None'      

# 3

testing[garage_cat_columns] = testing[testing['Id'].where(df['Id']isin(no_garage)).notnull()] \
        [garage_cat_columns].fillna("None")

# 4 tried with and without double brackets

testing[[garage_cat_columns]] = testing[testing['Id'].where(df['Id']isin(no_garage)).notnull()] \
        [garage_cat_columns].fillna("None", inplace=True)

# 5 Hail Mary

testing[testing['Id'].where(df['Id'].isin(no_garage)).notnull()] \
        [garage_cat_columns].fillna("None", inplace=True) = \ # equality here
testing[testing['Id'].where(df['Id'].isin(no_garage)).notnull()] \
        [garage_cat_columns].fillna("None", inplace=True)

非常感谢任何帮助!

如果需要设置所有 Id 如果包含至少一行数据且只有缺失值到字符串 None 使用:

garage_cat_columns = ['GarageType','GarageYrBlt','GarageQual','GarageCond','GarageFinish']

no_garage = testing.loc[testing[garage_cat_columns].isnull().all(axis=1), 'Id'].tolist()
testing.loc[df['Id'].isin(no_garage), garage_cat_columns] = 'None'

如果只需要设置所有 None 的行,如 Nonetype:

mask = testing[garage_cat_columns].isnull().all(axis=1)
testing.loc[mask, garage_cat_columns] = 'None'