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

使用stats.boxcox做归一化报错:Data must be 1-dimensional

问题原因与解决方案

核心问题

你调用stats.boxcox()时传入的replaced_precip_data是单列DataFrame(形状为(119040, 1)),属于2维数据结构,但boxcox要求输入必须是1维数组/Series。你检查的replaced_precip_data['Precip']是正确的1维Series,但代码里并没有把这个传给boxcox。

修正代码

把归一化代码里的replaced_precip_data换成replaced_precip_data['Precip'],同时还要确保该列是数值类型(原列是object,替换后可能仍未转换,会导致boxcox后续报错):

# 先转换为数值类型,避免后续类型错误
replaced_precip_data['Precip'] = pd.to_numeric(replaced_precip_data['Precip'], errors='coerce')

# 传入1维Series给boxcox,同时处理可能的空值
normalized_precip = pd.Series(stats.boxcox(replaced_precip_data['Precip'].dropna())[0], 
                              name='Precip', 
                              index=replaced_precip_data.dropna().index)

预处理优化建议

你的预处理步骤可以简化,同时避免潜在问题:

  • except_list里的'0'和0重复,因为原列是object类型,数值0会被存为字符串'0',只需要保留['T', '0']即可
  • 获取最小值时,直接对Series操作更简洁,避免DataFrame的axis参数问题:
weatherww2_data = pd.read_csv("../input/weatherww2/Summary of Weather.csv")
precip_series = weatherww2_data['Precip'].copy()

# 筛选非'T'、非'0'的行,转换为数值后取最小值
valid_precip = pd.to_numeric(precip_series[~precip_series.isin(['T', '0'])], errors='coerce').dropna()
min_precip = valid_precip.min()

# 替换'T'为最小值,同时转换全列为数值类型
replaced_precip_series = pd.to_numeric(precip_series.replace('T', min_precip), errors='coerce')

处理后replaced_precip_series是1维数值型Series,直接传给boxcox即可:

normalized_precip = pd.Series(stats.boxcox(replaced_precip_series.dropna())[0], 
                              name='Precip', 
                              index=replaced_precip_series.dropna().index)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:25:30