使用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
相关产品推荐
相关产品推荐

