Pandas中如何在def函数中实现带灵活参数的if条件逻辑
问题原因与解决方法
为什么第二种写法不符合预期?
你在第二种写法里提前把x = df['mark']、y = df['value']、z = df['score']赋值为整个DataFrame的列(Series类型)。当使用df.apply(frml, axis=1)按行执行函数时,frml里的(x > 3) and (y > 30)是对整列做判断,得到的是一个包含多个布尔值的Series,而非当前行的单个True/False。在Python的布尔判断中,非空的Series会被视为True,所以所有行都会执行return z * 10,自然和预期输出不符。
实现灵活参数的正确写法
要让判断逻辑里的列名可灵活修改,应该把列名作为参数传入函数,而非提前绑定整列。修改后的代码如下:
def frml(row, col_mark, col_value, col_score): if (row[col_mark] > 3) and (row[col_value] > 30): return row[col_score] * 10 else: return row[col_score] * 2 # 调用时传入要使用的列名,可随时修改 df['test1'] = df.apply(frml, axis=1, args=('mark', 'value', 'score'))
这样如果后续需要更换判断的列,比如用new_mark代替mark,只需要修改args里的参数即可,完全满足灵活修改的需求。
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

