我正在尝试定义一个函数,该函数根据"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'