Pandas逐行取非空值生成新列时嵌套条件判断结果异常如何解决?
原有逻辑问题说明
你写的嵌套np.where判断逻辑完全写反了:
第一层np.where(test.Year_2017.isna(), test.Year_2018, ...)的含义是只要2017列为空,就直接返回2018列的值,不管2018列是不是空,根本不会触发后续的嵌套判断。比如第0行2017是空,就直接返回2018的NaN,自然不会继续判断2019、2020的值,所以结果不对。
正确实现方法
你可以选任意一种更简洁的实现,不需要写复杂的嵌套判断:
方法1:修正嵌套np.where逻辑(不推荐,可读性差)
把判断逻辑反过来,先判断当前列是否非空,非空就取当前列,否则进下一层判断:
test['Final'] = np.where(test.Year_2017.notna(), test.Year_2017, np.where(test.Year_2018.notna(), test.Year_2018, np.where(test.Year_2019.notna(), test.Year_2019, test.Year_2020)))
方法2:按行向后填充取第一列(最通用,支持任意列数、多非空值取第一个的场景)
test['Final'] = test.bfill(axis=1).iloc[:, 0]
bfill(axis=1)是按行用右侧第一个非空值填充左侧空值,取填充后的第一列就能拿到每行按年份从早到晚优先级的第一个非空值。
方法3:对行求和(仅适用于每行只有1个非空值的你的场景,最简短)
test['Final'] = test.sum(axis=1, skipna=True)
sum默认跳过NaN值,每行只有一个数值的情况下求和结果就是那个非空值。
方法4:取每行第一个有效索引对应的值
test['Final'] = test.apply(lambda x: x[x.first_valid_index()], axis=1)
内容的提问来源于stack exchange,提问作者A2N15
相关产品推荐
相关产品推荐

