使用&仍触发ValueError: The truth value of a Series is ambiguous求助
问题分析与解决方案
错误原因
你的代码触发ValueError: The truth value of a Series is ambiguous的核心原因:
- 在
apply的lambda函数中,df.loc[(df["Year"]+1 == x['Year']) & (df['Fruits'] == x['Fruits'])]['Price']返回的是Series对象(哪怕只有一个匹配值,也是长度为1的Series),不是单个数值。 - if语句需要单个布尔值,但
x['Price'] < Series会生成布尔Series,Python无法判断这个Series的"真值",因此抛出错误。
另外你的实现方式效率极低:每次执行lambda都会遍历整个DataFrame查找匹配行,数据量大时性能会很差。
正确实现方案
要实现"对比当前行价格与下一年同水果价格,标记上涨情况"的需求,应该用groupby+shift高效处理,避免遍历整个DataFrame。
修正后的代码
import pandas as pd # 构建DataFrame(原代码中的db.pd应为pd) df = pd.DataFrame({ "Fruits": ["Apple", "Apple", "Apple", "Orange", "Orange", "Orange"], "Year": [2010, 2011, 2012, 2010, 2011, 2012], "Price": [2, 3, 1, 1, 2, 3] }) # 按水果分组,获取下一年的价格(将Price列向下偏移1行) df['Next_Year_Price'] = df.groupby('Fruits')['Price'].shift(-1) # 根据条件设置Change列:当前价格小于下一年价格时标记为Increase,否则为空 df['Change'] = df.apply( lambda x: "Increase" if pd.notna(x['Next_Year_Price']) and x['Price'] < x['Next_Year_Price'] else '', axis=1 ) # 可选:删除临时辅助列 df = df.drop('Next_Year_Price', axis=1) print(df)
执行结果
Fruits Year Price Change 0 Apple 2010 2 Increase 1 Apple 2011 3 2 Apple 2012 1 3 Orange 2010 1 Increase 4 Orange 2011 2 Increase 5 Orange 2012 3
关键逻辑说明
groupby('Fruits')['Price'].shift(-1):对每个水果分组后,将Price列的元素向上偏移一位,当前行的Next_Year_Price就对应下一年同水果的价格;分组内最后一行没有下一年数据,会填充为NaN。- 空值判断:用
pd.notna()排除NaN的情况,避免无效比较。 - 效率优势:
groupby和shift都是pandas的向量化操作,比循环遍历整个DataFrame的效率高几个数量级。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

