使用函数和条件为DataFrame新增列时遇错,求原因分析
问题原因分析与解决方案
核心错误原因
你遇到的ValueError: The truth value of a Series is ambiguous是主错误,后续的OSError是IPython回溯错误时的附加异常,根源在于代码逻辑完全不符合pandas.Series.apply()的运行机制:
apply()是逐元素处理Series中的每个值,但你的my_function直接操作整个df['Price']列(一个Series),df['Price'] <= 15000会返回布尔值组成的Series,Python无法将整个Series作为if判断的条件,因此抛出歧义错误。- 函数内多余的
df.iterrows()循环完全冗余,apply本身已经完成了逐元素遍历的工作。 - 函数参数
price_label名不副实,实际接收的是单个价格数值,而非标签。
修正方案
方法1:修复自定义函数并正确使用apply
def get_price_label(price): if price <= 15000: return "Low" elif 15000 < price <= 38000: return "Average" else: return "High" # 正确调用apply,逐元素传入价格值 df['Price Label'] = df['Price'].apply(get_price_label)
方法2:使用pandas内置分箱函数(更高效)
对于数值分箱打标签的场景,pd.cut()比自定义函数+apply更高效,代码更简洁:
import pandas as pd # 定义分箱区间和对应标签 bins = [float('-inf'), 15000, 38000, float('inf')] labels = ["Low", "Average", "High"] df['Price Label'] = pd.cut(df['Price'], bins=bins, labels=labels)
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

