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

Pandas读取Excel时一列原生Python数值一列全为numpy.float64的咨询

客队列类型匹配调整方案

问题根因

Pandas读取Excel时会对每一列自动做类型推断,这是主、客队列类型差异的核心原因:

  • 主队列HOME同时包含整数值(如342、232)和小数值(如0.5652、26.3),无法用统一的数值dtype(int64无法存储小数,float64存储会丢失原生int类型特性)承载,因此Pandas自动将列设置为object类型,直接存储Python原生的int、float对象,输出时就表现为原生混合类型。
  • 客队列AWAY被Pandas推断为纯float64数值列,底层由同类型numpy数组统一存储,因此所有元素均为numpy.float64类型——哪怕值是整数形态(如339.0),也会被存为浮点值,没有整数对应原生int的匹配逻辑。

具体实现步骤

在现有处理流程的dropna()操作后,对AWAY列做逐值类型转换,让整数值匹配原生int、小数值匹配原生float即可,转换逻辑和主队列完全对齐:

  1. 定义通用的数值类型转换函数:
    def to_native_num(x):
        # 兼容各类numpy数值类型输入
        if isinstance(x, np.number):
            val = float(x)
            # 整数值(如339.0)转原生int,带小数的值转原生float
            return int(val) if val.is_integer() else val
        return x
    
  2. 对客队列应用转换:
    new_teams_df['AWAY'] = new_teams_df['AWAY'].apply(to_native_num)
    

效果验证

转换完成后重新运行原有测试代码即可看到:

  • to_dict()输出的客队列中,原本的339.0会变为整数339、0.5这类小数值保持原有浮点形态
  • 逐元素类型检查时,整数值位置的类型为Python原生<class 'int'>,小数值位置的类型为Python原生<class 'float'>,和主队列的表现完全一致。

注意事项

  • 不要直接对客队列调用astype(object):该操作仅会把numpy.float64对象包装为object类型,底层元素依然是numpy.float64,无法得到Python原生的int/float类型。
  • 不要直接对客队列调用astype(int):会截断0.5、37.7这类小数值的小数部分,造成统计数据精度丢失。
  • 可选择的前置优化:如果希望减少读取后的转换开销,可在pd.read_excel()阶段直接指定两列的读取dtype为object,避免Pandas提前推断为float64:
    teams_df = pd.read_excel(
        "STATS.xlsm", 
        skiprows=8, 
        nrows=12, 
        usecols=[0,2],
        dtype={0: object, 2: object}
    )
    

    注:该方式仅能避免Pandas的自动类型推断,如果Excel单元格本身将整数设置为浮点格式(带.0后缀),依然需要通过前述逐值转换逻辑做类型匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 02:45:03