首先检查 NaN,然后基于另一列替换值的函数



我正在尝试定义一个函数,该函数根据"MSSubClass"列的值替换"BsmtFinType1"中的值。但是,我希望它首先检查以确保"要替换的值"是 NaN。如果它有值,它不会替换它。我不完全确定为什么我的样本不起作用。运行它后,任何值都不会更新。如果我删除第一个"If"语句,它会运行并替换值就可以了。有什么想法吗?

# Fill Basement Finishes
def fills_na(x):
if x['BsmtFinType1'] != np.NaN:
return x['BsmtFinType1']
elif x['MSSubClass'] < 60:
return 'Unf'
else:
return 'GLQ'
all_data['BsmtFinType1'] = all_data.apply(lambda x: bsmt_fin(x), axis=1)

我最终修改了函数并让它工作。相反,我使用了嵌套的if,而不是制作!= np。NaN 它自己的如果。

# Fill Basement Finishes
def fills_na(cols):
fin = cols[0]
subclass = cols[1]
if pd.isnull(fin):
if subclass < 60:
return 'Unf'
else:
return 'GLQ'
else:
return fin
all_data['BsmtFinType1'] = all_data[['BsmtFinType1','MSSubClass']].apply(fills_na, axis = 1)

好的,我打开了一个python交互环境,发现你需要使用~np.isnan(x['BsmtFinType1'])而不是!=

造成这种情况的原因是,默认情况下,DF 表示的 NaN 与 np 略有不同,因为它们的类型不同。

>>> type(np.NaN) 
class 'float'

>>> type(df['one']['d']) 
class 'numpy.float64'

最新更新