Dataframe添加列报错ValueError:Series真值判断歧义问题求助
Dataframe添加列触发ValueError的问题分析与解决
问题背景
数据源为2019年立陶宛总统选举第二轮投票结果CSV,其中PAVARDE为立陶宛语“姓氏”字段。尝试添加winner列标记当选总统时,触发错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
用户编写的代码如下:
def status(person): PAVARDE = person if PAVARDE == 'NAUSĖDA': return 'President' else: return 'looser' president_df['winner'] = president_df[['PAVARDE']].apply(status,axis=1)
问题原因
president_df[['PAVARDE']]返回的是单列Dataframe,使用apply(axis=1)时,传入status函数的person是一个Series对象(包含整行的单列数据),而非单个字符串值。此时PAVARDE == 'NAUSĖDA'会生成一个布尔Series,if语句无法判断整个Series的真值,因此抛出歧义错误。
解决方法
方法1:修改列选取方式(推荐)
使用单括号president_df['PAVARDE']返回Series,这样apply会将每个单元格的字符串值传入函数:
def status(person): if person == 'NAUSĖDA': return 'President' else: return 'looser' president_df['winner'] = president_df['PAVARDE'].apply(status)
方法2:在函数中提取Series的具体值
如果需要保留双括号的Dataframe选取方式,可在函数中提取Series的第一个元素:
def status(person): pavarde_value = person.iloc[0] if pavarde_value == 'NAUSĖDA': return 'President' else: return 'looser' president_df['winner'] = president_df[['PAVARDE']].apply(status, axis=1)
方法3:向量化操作(性能最优)
避免使用apply,改用向量化方法处理,效率更高:
# 使用numpy.where import numpy as np president_df['winner'] = np.where(president_df['PAVARDE'] == 'NAUSĖDA', 'President', 'looser') # 或者使用Series.map president_df['winner'] = president_df['PAVARDE'].map({'NAUSĖDA': 'President'}).fillna('looser')
内容的提问来源于stack exchange,提问作者Andrejus Jaroslavcevas
相关产品推荐
相关产品推荐

