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

Python ValueError求助:用Z-score检测欺诈数据异常值时维度不匹配

解决Z-score计算时的形状不匹配错误

错误原因

你当前的代码直接对整个DataFrame的所有列计算Z-score,核心问题有两个:

  • 如果DataFrame包含非数值类型列,daily_fraud.values会变成object类型数组,scipy的zscore处理时会出现维度异常,导致均值/标准差的形状和原数据不匹配。
  • 即使全是数值列,zscore默认按列计算,返回的是二维数组(行数×列数),而你试图把它赋值给DataFrame的单一列(一维),必然触发形状不匹配的报错。

解决方案

根据你的需求选择对应的处理方式:

1. 针对单一特征计算Z-score(最常用场景)

如果是要检测某一个数值列的异常值,单独指定该列即可:

from scipy.stats import zscore
# 替换成你实际要分析的数值列名,比如'交易金额'或'amount'
daily_fraud['zscore'] = zscore(daily_fraud['target_column'])
anomalies = daily_fraud[daily_fraud['zscore'].abs() > 2]

2. 对所有数值列批量计算并标记异常

如果需要同时检测多列的异常值,先筛选数值列,再逐列计算Z-score,最后标记任意一列超出阈值的行:

import pandas as pd
from scipy.stats import zscore

# 筛选所有数值类型的列
numeric_columns = daily_fraud.select_dtypes(include=['int64', 'float64']).columns
# 计算每列的Z-score
z_score_matrix = zscore(daily_fraud[numeric_columns])
# 转换为DataFrame方便后续处理
z_score_df = pd.DataFrame(z_score_matrix, columns=numeric_columns, index=daily_fraud.index)
# 筛选任意一列Z值绝对值大于2的异常行
anomalies = daily_fraud[(z_score_df.abs() > 2).any(axis=1)]

3. 处理缺失值导致的形状异常

如果数据中存在缺失值,也可能引发维度问题,先清理缺失值再计算:

# 用均值填充数值列的缺失值(可根据业务场景替换为中位数、0等)
daily_fraud_clean = daily_fraud.fillna(daily_fraud.mean(numeric_only=True))
# 再执行Z-score计算
daily_fraud_clean['zscore'] = zscore(daily_fraud_clean['target_column'])
anomalies = daily_fraud_clean[daily_fraud_clean['zscore'].abs() > 2]

内容的提问来源于stack exchange,提问作者Léa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:17:09