假设我有这样的示例代码
_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','发生在索引x')
UPDATE A:
简而言之,我正在使用来自kaggle.com的数据集,即Titanic:从灾难中学习机器,在该数据集中,我想引入一个新列,其条件是这样的。
如果男性且年龄为NaN,则插入男性的mean()年龄而不是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'))
[This答案还有其他替代解决方案。
希望这会有所帮助。