解决Pandas中Series真值判断歧义的ValueError问题
解决Pandas中ValueError: The truth value of a Series is ambiguous的问题
问题原因
你的代码里converted函数的判断逻辑存在错误:
if(df['Sales in kg']) == 20: df['Sales in kg']/2
df['Sales in kg']是一个Pandas Series对象,和20比较后会返回一个布尔值Series(每个元素对应是否等于20)。Pandas无法直接把整个布尔Series作为if的判断条件——它不知道你要判断“所有元素都满足”还是“至少一个满足”,因此抛出这个歧义错误。
另外还有两个小问题:
- 你只写了
df['Sales in kg']/2,但没有把计算结果赋值回原列,等于白做运算 - 函数最后返回的是全局的
data_frame1,而不是传入的df,不符合函数的设计逻辑
修复方案
方法1:用loc定位修改(推荐)
直接定位到“Sales in kg”列等于20的行,修改对应值:
def converted(df): # 复制原DataFrame避免修改原数据(可选,根据需求决定) df_copy = df.copy() df_copy.loc[df_copy['Sales in kg'] == 20, 'Sales in kg'] /= 2 return df_copy
方法2:用apply逐行处理
对“Sales in kg”列的每个元素做判断处理:
def converted(df): df_copy = df.copy() df_copy['Sales in kg'] = df_copy['Sales in kg'].apply(lambda x: x/2 if x ==20 else x) return df_copy
方法3:用numpy.where批量处理
import numpy as np def converted(df): df_copy = df.copy() df_copy['Sales in kg'] = np.where(df_copy['Sales in kg'] ==20, df_copy['Sales in kg']/2, df_copy['Sales in kg']) return df_copy
完整修正代码
import pandas as pd # 若使用方法3,需取消下面的注释 # import numpy as np data_frame1 = pd.DataFrame({'Fruits': ['Appple', 'Banana', 'Mango', 'Dragon Fruit', 'Musk melon', 'grapes'], 'Sales in kg': [20, 30, 15, 10, 50, 40]}) data_frame2 = pd.DataFrame({'Vegetables': ['tomato', 'Onion', 'ladies finger', 'beans', 'bedroot', 'carrot'], 'Sales in kg': [200, 310, 115, 110, 55, 45]}) data_frame3 = pd.DataFrame({'Baked Items': ['Cakes', 'biscuits', 'muffins', 'Rusk', 'puffs', 'cupcakes'], 'Sales in kg': [120, 130, 159, 310, 150, 140]}) print(data_frame1) print(data_frame2) print(data_frame3) data_frame4= data_frame1['Sales in kg']/100 print(data_frame4) def converted(df): df_copy = df.copy() df_copy.loc[df_copy['Sales in kg'] == 20, 'Sales in kg'] /= 2 return df_copy # 创建Excel写入对象 with pd.ExcelWriter("C:\\Users\\ppathar\\OneDrive - MORNINGSTAR INC\\Desktop\\demo.xlsx") as writer: data_frame1.to_excel(writer, sheet_name="Fruits", index=False) data_frame2.to_excel(writer, sheet_name="Vegetables", index=False) data_frame3.to_excel(writer, sheet_name="Baked Items", index=False) converted(data_frame1).to_excel(writer, sheet_name="Converted items", index=False) print("Excel printed")
内容的提问来源于stack exchange,提问作者Pratik Pathare
相关产品推荐
相关产品推荐

