如何解决Python中Pandas代码运行时触发的ValueError系列真值模糊报错?
报错原因
你遇到的报错翻译为:ValueError: Series的真值是不明确的,请使用a.empty、a.bool()、a.item()、a.any() 或 a.all()
触发原因是你的DataFrame存在重复索引:用df.loc[x]按索引取值时,匹配到了多行数据,返回的是多行行组成的Series而非单行,此时取['hour']得到的是多个值组成的序列,==9判断后得到的是一堆布尔值组成的Series,Python的if语句没法直接判定一堆布尔值整体是真还是假,所以抛出了歧义错误。
解决方案
方案1:调整遍历逻辑(保留循环写法)
如果你一定要用逐行遍历的写法,优先按行位置遍历,避开重复索引的影响:
for i in range(len(df)): if df.iloc[i]['hour'] == 9: print(True)
也可以直接遍历DataFrame的行对象:
for _, row in df.iterrows(): if row['hour'] == 9: print(True)
如果需要保留按索引遍历的写法,给判断加any()表示只要该索引下有一行满足条件就为真:
for x in df.index: if (df.loc[x]['hour'] == 9).any(): print(True)
方案2:向量化操作(更推荐,Pandas标准写法,性能远高于循环)
Pandas本身就支持批量判断,完全不需要写循环:
如果你只是要判断整个表中是否存在hour等于9的行:
if (df['hour'] == 9).any(): print(True)
如果你要筛选出所有hour等于9的行:
res = df[df['hour'] == 9] print(res)
内容的提问来源于stack exchange,提问作者Kamal Kannan
相关产品推荐
相关产品推荐

