You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用&仍触发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          

关键逻辑说明

  1. groupby('Fruits')['Price'].shift(-1):对每个水果分组后,将Price列的元素向上偏移一位,当前行的Next_Year_Price就对应下一年同水果的价格;分组内最后一行没有下一年数据,会填充为NaN。
  2. 空值判断:用pd.notna()排除NaN的情况,避免无效比较。
  3. 效率优势:groupby和shift都是pandas的向量化操作,比循环遍历整个DataFrame的效率高几个数量级。

内容的提问来源于stack exchange,提问作者Nitin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:08