You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决航班延迟均值计算中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}")

代码说明

  1. 先统一列名,确保分组时能正确匹配航空公司标识;
  2. 仅对延迟时间列做负值替换,避免字符串列参与数值比较;
  3. 按平均延迟降序排序,输出格式与预期完全一致。

内容的提问来源于stack exchange,提问作者Toshik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:46:47