遍历DataFrame行生成delayed_or_not列时条件判断异常求助
问题分析与解决办法
可能的错误原因
- 循环赋值方式错误:如果循环中直接用
df['delayed_or_not'] = 'delayed',会把整列覆盖为当前循环的结果,最终所有行都显示最后一次循环的判断值。 - 条件逻辑或列名错误:可能把判断条件写反,或者列名拼写错误,导致比较逻辑失效,所有行触发
if分支。 - 数据类型不匹配:如果两列是字符串格式的数字,按字符串规则比较(比如"10"<"2"会返回True),导致判断结果不符合预期。
正确解决方案
方案1:用Pandas矢量化操作(推荐,高效且不易出错)
使用apply方法:
import pandas as pd df['delayed_or_not'] = df.apply( lambda row: 'delayed' if row['Shipment_day_Scheduled'] < row['Order_to_shipment_day'] else 'not delayed', axis=1 )
或者用更高效的numpy.where:
import numpy as np df['delayed_or_not'] = np.where( df['Shipment_day_Scheduled'] < df['Order_to_shipment_day'], 'delayed', 'not delayed' )
方案2:正确使用循环遍历
如果一定要用循环,必须通过索引定位单行赋值:
# 先初始化新列 df['delayed_or_not'] = '' for idx, row in df.iterrows(): if row['Shipment_day_Scheduled'] < row['Order_to_shipment_day']: df.loc[idx, 'delayed_or_not'] = 'delayed' else: df.loc[idx, 'delayed_or_not'] = 'not delayed'
额外检查:数据类型转换
如果两列是字符串类型,先转为数值类型再比较:
df['Shipment_day_Scheduled'] = pd.to_numeric(df['Shipment_day_Scheduled'], errors='coerce') df['Order_to_shipment_day'] = pd.to_numeric(df['Order_to_shipment_day'], errors='coerce')
内容的提问来源于stack exchange,提问作者adeyanju damilare
相关产品推荐
相关产品推荐

