假设我有一个这样的示例代码
_d=pd.DataFrame([[1,2,3],[4,np.nan,6],[np.nan,np.nan,8]],columns=['x','y','z'])
现在,我有一个函数根据场景检查值并分配期望的值
def handling_nan(_d): if _d['x']==1.0: return 100 else: return _d
当我在下面的代码中使用这个函数时,
_result=_d.apply(lambda x:handling_nan(x))_result
我得到了错误
KeyError: (‘x’, ‘occurred at index x’)
更新A:
简而言之,我正在使用来自kaggle.com的数据集,即泰坦尼克号:机器学习从灾难中学习,在那个数据集中,我想引入一个新的列,条件是这样的。
如果是男性且年龄为NaN,则插入男性的平均年龄代替NaN,如果是女性且年龄为NaN,则插入女性总年龄的平均值代替NaN
回答:
在函数中遇到KeyError
是因为apply()
方法在数据框上默认axis=0
。这意味着函数将应用于每一列而不是每一行。要消除这个错误,需要将apply()
调用替换为:
_result=_d.apply(lambda x:handling_nan(x), axis=1)
从编辑来看,问题是要用分组的平均值替换数据集中的NaNs
。
这可以使用fillna()
和transform()
方法完成,如下所示:
l = [["M", 30], ["M", 45], ["M", None], ["F", 76], ["F", 23], ["F", None]]df = pd.DataFrame(l, columns=["sex", "age"])df['age'] = df['age'].fillna(df.groupby("sex")['age'].transform('mean'))
这个答案有其他替代解决方案。
希望这对你有帮助。