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即可,转换逻辑和主队列完全对齐:
- 定义通用的数值类型转换函数:
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 - 对客队列应用转换:
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
相关产品推荐
相关产品推荐

