Pandas中apply的Lambda函数与直接代码输出不一致原因咨询
问题原因与解决方法
错误根源
你在apply的lambda函数里犯了一个语法错误:x['date1'].date是引用Timestamp对象的date方法本身,而非调用该方法获取具体的日期值。
当你写x['date1'].date != x['date2'].date时,实际上是在比较两个方法对象的引用地址,这两个方法引用必然不相等,所以这个日期条件永远返回True。只要数值差绝对值大于0.5,整个判断条件就会成立,最终所有行都输出yes,完全不符合预期。
修正后的代码
把date改为date(),调用方法获取date对象后再比较:
df.apply(lambda x : 'yes' if (abs(x['value1'] - x['value2']) > .5) & (x['date1'].date() != x['date2'].date()) else 'no', axis = 1)
运行后会得到和直接向量化操作一致的结果:
0 no 1 no 2 yes 3 yes 4 no dtype: object
额外建议
在Pandas中,直接使用向量化操作(你写的第二种方式)比apply+lambda的效率高得多,尤其是处理大数据集时。推荐优先使用向量化逻辑,再将布尔结果映射为'yes'/'no':
import numpy as np df['flag'] = np.where( (abs(df['value1'] - df['value2']) > .5) & (df['date1'].dt.date != df['date2'].dt.date), 'yes', 'no' )
内容的提问来源于stack exchange,提问作者Karthik S
相关产品推荐
相关产品推荐

