BMI数据集(500,4)分析代码报错:ValueError: 元素数量不匹配问题排查求助
解决BMI数据集分析代码的维度不匹配报错
首先,你的报错ValueError: Length mismatch: Expected axis has 12 elements, new values have 9 elements是因为拼接后的DataFrame列数和你定义的列名列表长度不一致,核心问题出在uniques列的生成逻辑上,另外还有几处小问题需要修正,具体如下:
问题1:uniques列的生成错误
你写的uniques = data.apply(lambda x: [x.unique])有两个明显问题:
x.unique是方法对象,没有调用执行,应该写成x.unique()来获取列的唯一值数组- 额外套了一层列表
[],会导致pandas在拼接时可能把列表展开成多列(如果不同列的唯一值数量不同,就会出现列数膨胀)
应该修改为:
uniques = data.apply(lambda x: x.unique().tolist())
这样会返回一个Series,每个元素是对应列的唯一值列表,保证拼接时只占1列。
问题2:硬编码全局变量BMI_df
在计算相关性时,你用了corr = BMI_df.corr()[pred],但函数参数是data,这样不符合函数的封装性,如果传入其他数据集会报错,应该改为:
corr = data.corr()[pred]
问题3:字符串换行语法错误
你的print语句:
print('____________________________ Data types: ', dtypes)
在Python中这样的换行写法会导致语法错误,应该用\n来实现换行:
print('____________________________\nData types:\n', dtypes)
问题4:相关性列名和后续排序不匹配
你定义corr_col = 'corr' + pred,当pred='Weight'时列名是corrWeight,但后面排序用的是'corr Weight'(带空格),所以需要调整列名定义:
corr_col = 'corr ' + pred
修正后的完整代码
import pandas as pd def detailed_analysis(data, pred = None): obs = data.shape[0] types = data.dtypes counts = data.apply(lambda x: x.count()) # 修正uniques的生成逻辑 uniques = data.apply(lambda x: x.unique().tolist()) nulls = data.apply(lambda x: x.isnull().sum()) distincts = data.apply(lambda x: x.unique().shape[0]) missing_ratio = (nulls / obs)*100 # 新增numeric_only,避免非数值列计算偏度/峰度报错 skewness = data.skew(numeric_only=True) kurtosis = data.kurt(numeric_only=True) print('Data shape:', data.shape) if pred is None: cols = ['types', 'counts', 'nulls', 'distincts', 'missing_ratio', 'uniques', 'skewness', 'kurtosis'] details = pd.concat([types, counts, nulls, distincts, missing_ratio, uniques, skewness, kurtosis], axis=1) else: # 用data代替BMI_df,避免硬编码全局变量 corr = data.corr(numeric_only=True)[pred] details = pd.concat([types, counts, nulls, distincts, missing_ratio, uniques, skewness, kurtosis, corr], axis=1 , sort=False) # 修正列名,添加空格匹配后续排序需求 corr_col = 'corr ' + pred cols = ['types', 'counts', 'nulls', 'distincts', 'missing_ratio', 'uniques', 'skewness', 'kurtosis', corr_col] details.columns = cols dtypes = details.types.value_counts() # 修正换行语法 print('____________________________\nData types:\n', dtypes) print('____________________________') return details # 假设BMI_df已完成加载 details = detailed_analysis(BMI_df, 'Weight') display(details.sort_values(by='corr Weight', ascending=False))
另外,我还新增了numeric_only=True参数到skew()和kurt()方法中,因为你的数据集里有Gender这样的字符串列,直接计算偏度和峰度会报错,这个参数可以只对数值型列计算,非数值列会返回NaN,避免报错。
内容的提问来源于stack exchange,提问作者Dfhaa_DK




