Pandas apply报错ValueError:Series真值模糊,如何用apply生成新列?
解决Pandas生成新列时的ValueError问题
嘿,这个问题我之前也踩过坑!咱们来拆解一下问题,然后给出最靠谱的解决方案~
错误原因分析
你写的lambda里直接用了df_transactions['plan_list_price'] ==0 & df_transactions['actual_amount_paid'] >0,这会生成一个整个DataFrame列的布尔数组。而apply默认是对列的每个元素单独处理的,这时候Pandas不知道你要判断这个布尔数组的整体真值(是要任意一个为真?还是全部为真?),所以就抛出了ValueError。
最优解决方案:用矢量化操作(推荐)
其实完全不需要用apply,Pandas的矢量化操作不仅代码简洁,运行效率还高得多!直接基于列的布尔条件生成新列:
# 注意括号!&的优先级比比较运算符高,必须给每个条件加括号 df_transactions['emome'] = ((df_transactions['plan_list_price'] == 0) & (df_transactions['actual_amount_paid'] > 0)).astype(int)
这段代码会先对每一行判断两个条件:plan_list_price等于0 且 actual_amount_paid大于0,生成一个布尔Series,最后把布尔值转成整数(True→1,False→0)。
如果一定要用apply的写法
如果你因为某些场景必须用apply,那要让它逐行处理数据,而不是只处理单个列的元素。这时候需要指定axis=1,让lambda接收每一行的对象:
df_transactions['emome'] = df_transactions.apply( lambda row: 1 if (row['plan_list_price'] == 0) & (row['actual_amount_paid'] > 0) else 0, axis=1 ).astype(int)
这里的row代表DataFrame的每一行,你可以直接通过row['列名']获取该行对应列的值,这样判断的就是单一行的条件,不会产生整个Series的歧义。
⚠️ 注意:apply(axis=1)的运行效率远低于矢量化操作,数据量较大的时候不推荐使用哦!
内容的提问来源于stack exchange,提问作者Chia Yi
相关产品推荐
相关产品推荐

