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

Pandas中int64列调用.corr()返回重复相关系数是Bug吗?

问题原因
  • 代码存在基础语法错误:你定义待转换列列表时,'L'和'GB'之间遗漏了逗号,Python会自动将相邻的字符串字面量拼接为'LGB',导致L列实际未被纳入转换范围,对比两次相关系数结果可以发现,L列的系数和转换前完全一致,就是该问题导致的。
  • 类型转换逻辑存在致命缺陷:numpy的int64类型不支持存储缺失值NaN,你要转换的原float64列普遍存在缺失值,且GB列为object类型,包含非数值内容,直接调用.values.astype(np.int64)强转时,会将NaN、非数值内容强制转换为无意义的垃圾整数值,直接破坏原始列的数据分布,这就是所有被转换列的相关系数出现重复异常值的根本原因。
修复方案

根据你的需求(仅提升数据可读性),有两种可选方案:

  1. 无需修改原始存储类型,仅调整显示格式(最推荐,完全不会破坏数据)
    不需要对列做类型转换,只要设置pandas全局显示规则,让无小数位的浮点数以整数样式展示即可:
    import pandas as pd
    # 自定义浮点数显示格式:整数型浮点数不显示小数位,其余保留3位小数
    pd.set_option('display.float_format', lambda x: f'{x:.0f}' if pd.notna(x) and x.is_integer() else f'{x:.3f}')
    
  2. 确需转换为整数类型时,使用pandas可空整数类型
    不要使用numpy的np.int64,改用pandas自带的Int64(首字母大写)类型,该类型支持存储缺失值,同时需要先对object类型的列做数值转换,避免非数值内容报错:
    import pandas as pd
    import numpy as np
    # 先修正列表的逗号错误
    convert_col = ['Age', 'Team Rank', 'W', 'L', 'GB']
    for col in df_final.columns:
        if ('TOT' in col) or (col in convert_col):
            # 先将列统一转为数值,非数值内容转为NaN,再转可空整数类型
            df_final[col] = pd.to_numeric(df_final[col], errors='coerce').astype('Int64')
    # 计算相关系数时,pandas会自动忽略可空整数类型的缺失值,结果和float64类型下一致
    print(df_final.corr()['Share'])
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:57:37