Pandas中如何在for循环内使用if else语句及解决对应报错
问题原因
你的代码存在3个核心问题,直接触发了报错:
- 遍历逻辑完全错误:直接
for people in andrew_lewis迭代DataFrame对象,拿到的是DataFrame的列名字符串,根本不是逐行的样本数据,和你想要遍历每一行的预期完全不符。 - 条件判断返回的是整列序列:if语句里的
andrew_lewis['MRR'] == 'KC2'会生成一个和原表长度一致的布尔型Series(每一行对应一个「MRR列是否等于KC2」的判断结果),Python原生if只能识别单个布尔值,无法直接判断一整个序列的真假,就会抛出你看到的ValueError: The truth value of a Series is ambiguous报错。 - 计算结果没有回写:就算判断逻辑能正常运行,
andrew_lewis['payout'] * 100只是临时做了乘法计算,没有把结果赋值回原DataFrame的对应列,根本不会修改原数据。
正确实现方式
Pandas做这类按条件改值的操作,优先用向量化方法,不要写for循环,运行效率比逐行遍历高几十到上百倍,是官方推荐的标准写法:
import numpy as np # 满足MRR=KC2的行,payout列值乘100;不满足的行保留原payout值 andrew_lewis['payout'] = np.where( andrew_lewis['MRR'] == 'KC2', andrew_lewis['payout'] * 100, andrew_lewis['payout'] ) # 如果需要检测到不符合条件的行就输出wrong,可以加下面这段判断 if (andrew_lewis['MRR'] != 'KC2').any(): print('wrong')
如果你因为特殊业务需求必须逐行遍历处理(数据量大于1万行时不推荐,速度会非常慢),可以用iterrows()接口实现逐行操作:
for idx, row in andrew_lewis.iterrows(): if row['MRR'] == 'KC2': andrew_lewis.loc[idx, 'payout'] = row['payout'] * 100 else: print('wrong')
内容的提问来源于stack exchange,提问作者max2lax
相关产品推荐
相关产品推荐

