执行Mann-Whitney U检验时触发TypeError:isnan不支持输入类型
Mann-Whitney U检验报错"ufunc 'isnan' not supported..."的原因及解决办法
核心原因
报错本质是传入mannwhitneyu的数据不是数值类型——即便已经清理了NaN,scipy底层的isnan函数无法处理非数值(比如字符串、object类型)的数据,因此抛出TypeError。
具体排查与解决步骤
检查数据类型
先确认两个数据框目标列的类型:print(primary_tumor_df.dtypes) print(healthy_tissue_df.dtypes)如果输出为
object,说明列中可能混有字符串(比如带逗号的数字、非数值字符),或是数字被错误识别为字符串类型。转换为数值类型
使用pd.to_numeric强制转换目标列,同时处理转换失败的情况:primary_tumor_df['target_col'] = pd.to_numeric(primary_tumor_df['target_col'], errors='coerce') healthy_tissue_df['target_col'] = pd.to_numeric(healthy_tissue_df['target_col'], errors='coerce') # 清理转换产生的新NaN primary_tumor_df.dropna(subset=['target_col'], inplace=True) healthy_tissue_df.dropna(subset=['target_col'], inplace=True)确保输入是一维数组
传入mannwhitneyu的必须是一维数据(而非整个数据框),比如检验某列gene_expression:from scipy.stats import mannwhitneyu stat, p = mannwhitneyu(primary_tumor_df['gene_expression'], healthy_tissue_df['gene_expression'])排查特殊非数值类型
部分数据看似数值,实际是布尔值、空字符串等特殊类型,可通过以下代码排查:# 查看目标列首个元素的类型 print(type(primary_tumor_df['target_col'].iloc[0])) # 筛选无法转为数值的行 non_numeric_rows = primary_tumor_df[pd.to_numeric(primary_tumor_df['target_col'], errors='coerce').isna()] print(non_numeric_rows)
内容的提问来源于stack exchange,提问作者Rabin Bishwokarma
相关产品推荐
相关产品推荐

