解决航班延迟均值计算中Float64求和报错:'str'与'int'无法比较
航空公司平均延迟计算报错解决
任务要求
计算每家航空公司(Carrier)的平均延迟时间,需排除负值。
航班数据集
Carrier ArrDelay DepDelay Car1 10 14 Car1 -3 0 Car2 20 13 Car2 14 15 Car3 -3 -1 Car3 2 1 Car3 -10 -3
手动计算结果
Car1: (10 + 14) / 2 = 12 Car2: (20 + 13 + 14 + 15) / 2 = 31 Car3: (2 + 1) / 3 = 0.66
预期输出
Car2 31 Car1 12 Car3 0.66
用户原代码
out = ( df.mask(df.lt(0), 0) .assign(AverageAllDelay= lambda x: x['ArrDelay'].add(x['DepDelay'])) .groupby('Carrier', as_index=False)['AverageAllDelay'].mean() ) print(out)
问题描述
运行上述代码时出现错误:< not supported between instances of 'str' and 'int'。初始时,ArrDelay和DepDelay字段从CSV文件读取为Float64格式,已尝试多种方法将其转换为整数,但均未解决问题,请求有效的解决办法。
参考数据集
data = { 'Carrier ': {0: '1', 1: '1', 2: '2', 3: '2', 4: '3', 5: '3', 6: '3'}, 'ArrDelay': {0: 10, 1: -3, 2: 20, 3: 14, 4: -3, 5: 2, 6: -10}, 'DepDelay': {0: 14, 1: 0, 2: 13, 3: 15, 4: -1, 5: 1, 6: -3} }
问题分析与解决办法
报错根源有两点:
- 全表数值比较触发类型冲突:原代码中
df.mask(df.lt(0), 0)对所有列执行小于0的判断,但Carrier列是字符串类型,字符串与整数0直接比较会触发类型不兼容错误。 - 列名不匹配:参考数据集里的航空公司列名是
'Carrier '(末尾带空格),但原代码groupby('Carrier')使用无空格的列名,会导致分组逻辑失效。
修正后的代码如下:
# 修正列名,移除Carrier列末尾的空格 df = df.rename(columns={'Carrier ': 'Carrier'}) # 仅针对数值列处理负值,替换为0 numeric_cols = ['ArrDelay', 'DepDelay'] df[numeric_cols] = df[numeric_cols].mask(df[numeric_cols].lt(0), 0) # 计算总延迟并按航空公司分组求平均,最后按预期排序输出 out = ( df.assign(AverageAllDelay=lambda x: x['ArrDelay'] + x['DepDelay']) .groupby('Carrier', as_index=False)['AverageAllDelay'] .mean() .sort_values('AverageAllDelay', ascending=False) ) # 格式化输出为预期样式 for _, row in out.iterrows(): print(f"{row['Carrier']} {row['AverageAllDelay']:.2f}")
代码说明
- 先统一列名,确保分组时能正确匹配航空公司标识;
- 仅对延迟时间列做负值替换,避免字符串列参与数值比较;
- 按平均延迟降序排序,输出格式与预期完全一致。
内容的提问来源于stack exchange,提问作者Toshik
相关产品推荐
相关产品推荐

